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 | |