Spaces:
Build error
Build error
| # 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 | |