|
""" |
|
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: |
|
|
|
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: |
|
|
|
assert arg.startswith('--') |
|
key, val = arg.split('=') |
|
key = key[2:] |
|
if key in globals(): |
|
try: |
|
|
|
attempt = literal_eval(val) |
|
except (SyntaxError, ValueError): |
|
|
|
attempt = val |
|
|
|
assert type(attempt) == type(globals()[key]) |
|
|
|
print(f"Overriding: {key} = {attempt}") |
|
globals()[key] = attempt |
|
else: |
|
raise ValueError(f"Unknown config key: {key}") |
|
|