in torchx/runner/config.py [0:0]
def load(scheduler: str, f: TextIO, cfg: Dict[str, CfgVal]) -> None:
"""
loads the section ``[{scheduler}]`` from the given
configfile ``f`` (in .INI format) into the provided ``runcfg``, only adding
configs that are NOT currently in the given ``runcfg`` (e.g. does not
override existing values in ``runcfg``). If no section is found, does nothing.
"""
config = _configparser()
config.read_file(f)
runopts = _get_scheduler(scheduler).run_opts()
section = f"{scheduler}"
if config.has_section(section):
for name, value in config.items(section):
if name in cfg.keys():
# DO NOT OVERRIDE existing configs
continue
if value == _NONE:
# should map to None (not str 'None')
# this also handles empty or None lists
cfg[name] = None
else:
runopt = runopts.get(name)
if runopt is None:
log.warning(
f"`{name} = {value}` was declared in the [{section}] section "
f" of the config file but is not a runopt of `{scheduler}` scheduler."
f" Remove the entry from the config file to no longer see this warning"
)
else:
if runopt.opt_type is bool:
# need to handle bool specially since str -> bool is based on
# str emptiness not value (e.g. bool("False") == True)
cfg[name] = config.getboolean(section, name)
elif runopt.opt_type is List[str]:
cfg[name] = value.split(";")
else:
# pyre-ignore[29]
cfg[name] = runopt.opt_type(value)