Spaces:
Running
Running
""" | |
Poor Man's Configurator. Probably a terrible idea. Example usage: | |
$ python train.py config/override_file.py --batch_size=32 | |
this will first run config/override_file.py, then override batch_size to 32 | |
The code in this file will be run as follows from e.g. train.py: | |
exec(open('configurator.py').read()) | |
So it's not a Python module, it's just shuttling this code away from train.py | |
The code in this script then overrides the globals() | |
I know people are not going to love this, I just really dislike configuration | |
complexity and having to prepend config. to every single variable. If someone | |
comes up with a better simple Python solution I am all ears. | |
""" | |
import sys | |
from ast import literal_eval | |
for arg in sys.argv[1:]: | |
if '=' not in arg: | |
# assume it's the name of a config file | |
assert not arg.startswith('--') | |
config_file = arg | |
print(f"Overriding config with {config_file}:") | |
with open(config_file) as f: | |
print(f.read()) | |
exec(open(config_file).read()) | |
else: | |
# assume it's a --key=value argument | |
assert arg.startswith('--') | |
key, val = arg.split('=') | |
key = key[2:] | |
if key in globals(): | |
try: | |
# attempt to eval it it (e.g. if bool, number, or etc) | |
attempt = literal_eval(val) | |
except (SyntaxError, ValueError): | |
# if that goes wrong, just use the string | |
attempt = val | |
# ensure the types match ok | |
assert type(attempt) == type(globals()[key]) | |
# cross fingers | |
print(f"Overriding: {key} = {attempt}") | |
globals()[key] = attempt | |
else: | |
raise ValueError(f"Unknown config key: {key}") | |