akhaliq3
spaces demo
546a9ba
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT license.
import os
class Arguments:
def __init__(self, confFile):
if not os.path.exists(confFile):
raise Exception("The argument file does not exist: " + confFile)
self.confFile = confFile
def is_int(self, s):
try:
int(s)
return True
except ValueError:
return False
def is_float(self, s):
try:
float(s)
return True
except ValueError:
return False
def is_bool(self, s):
return s.lower() == "true" or s.lower() == "false"
# def readHyperDriveArguments(self, arguments):
# hyperdrive_opts = {}
# for i in range(0, len(arguments), 2):
# hp_name, hp_value = arguments[i:i+2]
# hp_name = hp_name.replace("--", "")
# if self.is_int(hp_value):
# hp_value = int(hp_value)
# elif self.is_float(hp_value):
# hp_value = float(hp_value)
# hyperdrive_opts[hp_name] = hp_value
# return hyperdrive_opts
def add_opt(self, opt, key, value, force_override=False):
if not key in opt or force_override:
opt[key] = value
if self.is_int(value):
opt[key] = int(value)
elif self.is_float(value):
opt[key] = float(value)
elif self.is_bool(value):
opt[key] = value.lower() == "true"
else:
print("Warning: Option key %s already exists" % key)
def readArguments(self):
"""
Parse config file.
Supported syntax:
- general form: var WHITESPACE val, with WHITESPACE=space or TAB
- whole-line or line-end comments begin with #
- lines that end with backslash are continuation lines
- multiple values are white-space separated, hence no spaces allowed in keys or values
"""
opt = {}
with open(self.confFile, encoding="utf-8") as f:
prev_line = "" # allow multi-line arguments
for line in f:
# concatenate previous line if it ended in backslash
line = prev_line + line.strip()
if line.endswith("\\"):
prev_line = line[:-1] + " "
continue
prev_line = ""
l = line.replace("\t", " ")
# strip comments
pos = l.find("#")
if pos >= 0:
l = l[:pos]
parts = l.split()
if not parts:
continue # empty line or line comment
elif len(parts) == 1:
key = parts[0]
if not key in opt:
opt[key] = True
else:
key = parts[0]
value = " ".join(parts[1:])
self.add_opt(opt, key, value)
assert not prev_line, "Config file must not end with a backslash"
return opt