def _resolve_dict(key, decl): #TODO(robnagler) assert "required" res = pkcollections.OrderedMapping( copy.deepcopy(decl.default) if decl.default else {}) assert isinstance(res, (dict, pkcollections.OrderedMapping)), \ '{}: default ({}) must be a dict'.format(key.msg, decl.default) key_prefix = key + '_' for k in reversed(sorted(_raw_values.keys())): if k != key and not k.startswith(key_prefix): continue r = res if len(k.parts) == 1: # os.environ has only one part (no way to split on '.') # so we have to assign the key's suffix manually ki = k.parts[0][len(key_prefix):] #TODO(robnagler) if key exists, preserve case (only for environ) else: kp = k.parts[len(key.parts):-1] for k2 in kp: if not k2 in r: r[k2] = pkcollections.OrderedMapping() else: assert isinstance(r[k2], (dict, pkcollections.OrderedMapping)), \ '{}: type collision on existing non-dict ({}={})'.format( k.msg, k2, r[k2]) r = r[k2] ki = k.parts[-1] r[ki] = _raw_values[k] return res
def init(**kwargs): """Declares and initializes config params for calling module. Args: kwargs (dict): param name to (default, parser, docstring) Returns: Params: `pkcollections.OrderedMapping` populated with param values """ if '_caller_module' in kwargs: # Internal use only: _values() calls init() to initialize pkconfig.cfg m = kwargs['_caller_module'] del kwargs['_caller_module'] else: if pkinspect.is_caller_main(): print( 'pkconfig.init() called from __main__; cannot configure, ignoring', file=sys.stderr) return None m = pkinspect.caller_module() assert pkinspect.root_package(m) in _load_path, \ '{}: module root not in load_path ({})'.format(m.__name__, _load_path) mnp = m.__name__.split('.') for k in reversed(mnp): kwargs = {k: kwargs} decls = {} _flatten_keys([], kwargs, decls) _coalesce_values() res = pkcollections.OrderedMapping() _iter_decls(decls, res) for k in mnp: res = res[k] return res
def _iter_decls(decls, res): """Iterates decls and resolves values into res Args: decls (dict): nested dictionary of a module's cfg values res (OrderedMapping): result configuration for module """ for k in sorted(decls.keys()): #TODO(robnagler) deal with keys with '.' in them (not possible?) d = _Declaration(decls[k]) r = res for kp in k.parts[:-1]: if kp not in r: r[kp] = pkcollections.OrderedMapping() r = r[kp] kp = k.parts[-1] if d.group: r[kp] = pkcollections.OrderedMapping() continue r[kp] = _resolver(d)(k, d) _parsed_values[k] = r[kp]
def open_data_file(run_dir, model_name, file_index=None): """Opens data file_index'th in run_dir Args: run_dir (py.path): has subdir ``hdf5`` file_index (int): which file to open (default: last one) Returns: OrderedMapping: various parameters """ files = _h5_file_list(run_dir, model_name) res = pkcollections.OrderedMapping() res.num_frames = len(files) res.frame_index = res.num_frames - 1 if file_index is None else file_index res.filename = str(files[res.frame_index]) res.iteration = int(re.search(r'data(\d+)', res.filename).group(1)) return res