def element_fill_with_defaults(self, element_name): """ Fills the config with any defaults for element_name If item is a dict, then calls dict_with_defaults """ config_item=getattr(self, element_name, None) default_item=get_system_defaults().get(element_name, None) if config_item is None: if default_item is None: error_msg="Element %s not in defaults or config" % element_name self.log.critical(error_msg) else: config_item=default_item if type(config_item) is dict: if type(default_item) is dict: config_item=self.dict_with_defaults(element_name) else: if type(default_item) is dict: error_msg="Config item %s is not a dict, but it is in the default!" % element_name self.log.critical(error_msg) setattr(self, element_name, config_item)
def dict_with_defaults(self, element_name): """ Returns config.element_name with any keys missing replaced with system defaults Only works for configs where the element is a dict """ config_dict=copy(getattr(self, element_name, dict())) default_dict=get_system_defaults().get(element_name, dict()) required=default_dict.keys() for dict_key in required: ## key automatically in default... if dict_key not in config_dict: config_dict[dict_key]=default_dict[dict_key] if type(config_dict[dict_key]) is dict: if type(default_dict[dict_key]) is dict: config_dict[dict_key]=self.nested_dict_with_defaults(element_name, dict_key) else: if type(default_dict[dict_key]) is dict: error_msg="You've created a config where %s.%s is not a dict, but it is in the default config!"%(element_name, dict_key) self.log.critical(error_msg) return config_dict
def fill_with_defaults(self): """ Fills with defaults >>> config=Config(dict(forecast_cap=22.0, forecast_scalar_estimate=dict(backfill=False), forecast_weight_estimate=dict(correlation_estimate=dict(min_periods=40)))) >>> config Config with elements: forecast_cap, forecast_scalar_estimate, forecast_weight_estimate >>> config.fill_with_defaults() >>> config.forecast_scalar 1.0 >>> config.forecast_cap 22.0 >>> config.forecast_scalar_estimate['pool_instruments'] True >>> config.forecast_scalar_estimate['backfill'] False >>> config.forecast_weight_estimate['correlation_estimate']['min_periods'] 40 >>> config.forecast_weight_estimate['correlation_estimate']['ew_lookback'] 500 """ self.log.msg("Adding config defaults") existing_elements=self._elements default_elements=list(get_system_defaults().keys()) new_elements=list(set(existing_elements+default_elements)) [self.element_fill_with_defaults(element_name) for element_name in new_elements] setattr(self, "_elements", new_elements)
def fill_with_defaults(self): """ Fills with defaults >>> config=Config(dict(forecast_cap=22.0, forecast_scalar_estimate=dict(backfill=False), forecast_weight_estimate=dict(correlation_estimate=dict(min_periods=40)))) >>> config Config with elements: forecast_cap, forecast_scalar_estimate, forecast_weight_estimate >>> config.fill_with_defaults() >>> config.forecast_scalar 1.0 >>> config.forecast_cap 22.0 >>> config.forecast_scalar_estimate['pool_instruments'] True >>> config.forecast_scalar_estimate['backfill'] False >>> config.forecast_weight_estimate['correlation_estimate']['min_periods'] 40 >>> config.forecast_weight_estimate['correlation_estimate']['ew_lookback'] 500 """ self.log.msg("Adding config defaults") self_as_dict = self.as_dict() default_dict = get_system_defaults() new_dict = fill_config_dict_with_defaults(self_as_dict, default_dict) self._create_config_from_dict(new_dict)
def dict_with_defaults(self, element_name): """ Returns config.element_name with any keys missing replaced with system defaults Only works for configs where the element is a dict """ config_dict = copy(getattr(self, element_name, dict())) default_dict = get_system_defaults().get(element_name, dict()) required = default_dict.keys() for dict_key in required: # key automatically in default... if dict_key not in config_dict: config_dict[dict_key] = default_dict[dict_key] if isinstance(config_dict[dict_key], dict): if isinstance(default_dict[dict_key], dict): config_dict[dict_key] = self.nested_dict_with_defaults( element_name, dict_key) else: if isinstance(default_dict[dict_key], dict): error_msg = "You've created a config where %s.%s is not a dict, but it is in the default config!" % ( element_name, dict_key) self.log.critical(error_msg) return config_dict
def element_fill_with_defaults(self, element_name): """ Fills the config with any defaults for element_name If item is a dict, then calls dict_with_defaults """ config_item = getattr(self, element_name, None) default_item = get_system_defaults().get(element_name, None) if config_item is None: if default_item is None: error_msg = "Element %s not in defaults or config" % element_name self.log.critical(error_msg) else: config_item = default_item if isinstance(config_item, dict): if isinstance(default_item, dict): config_item = self.dict_with_defaults(element_name) else: if isinstance(default_item, dict): error_msg = "Config item %s is not a dict, but it is in the default!" % element_name self.log.critical(error_msg) setattr(self, element_name, config_item)
def fill_with_defaults(self): """ Fills with defaults >>> config=Config(dict(forecast_cap=22.0, forecast_scalar_estimate=dict(backfill=False), forecast_weight_estimate=dict(correlation_estimate=dict(min_periods=40)))) >>> config Config with elements: forecast_cap, forecast_scalar_estimate, forecast_weight_estimate >>> config.fill_with_defaults() >>> config.forecast_scalar 1.0 >>> config.forecast_cap 22.0 >>> config.forecast_scalar_estimate['pool_instruments'] True >>> config.forecast_scalar_estimate['backfill'] False >>> config.forecast_weight_estimate['correlation_estimate']['min_periods'] 40 >>> config.forecast_weight_estimate['correlation_estimate']['ew_lookback'] 500 """ self.log.msg("Adding config defaults") existing_elements = self._elements default_elements = list(get_system_defaults().keys()) new_elements = list(set(existing_elements + default_elements)) [ self.element_fill_with_defaults(element_name) for element_name in new_elements ] setattr(self, "_elements", new_elements)
def get_list_of_private_then_default_key_values(list_of_key_names, fail_if_any_missing=True): result_dict = {} system_defaults_dict = get_system_defaults() private_config_dict = get_private_config() for key_name in list_of_key_names: key_value = get_private_then_default_key_value( key_name, system_defaults_dict=system_defaults_dict, private_config_dict=private_config_dict, raise_error=fail_if_any_missing) result_dict[key_name] = key_value return result_dict
def nested_dict_with_defaults(self, element_name, dict_name): """ Returns config.element_name[dict_name] with any keys required replaced with system defaults Only works for configs where the element is a nested dict """ element_in_config = copy(getattr(self, element_name, dict())) nested_config_dict = element_in_config.get(dict_name, dict()) element_in_default = get_system_defaults().get(element_name, dict()) nested_default_dict = element_in_default.get(dict_name, dict()) required = nested_default_dict.keys() if len(required) > 0: for dict_key in required: if dict_key not in nested_config_dict: nested_config_dict[dict_key] = nested_default_dict[ dict_key] return nested_config_dict
def nested_dict_with_defaults(self, element_name, dict_name): """ Returns config.element_name[dict_name] with any keys required replaced with system defaults Only works for configs where the element is a nested dict """ element_in_config=copy(getattr(self, element_name, dict())) nested_config_dict=element_in_config.get(dict_name,dict()) element_in_default=get_system_defaults().get(element_name, dict()) nested_default_dict=element_in_default.get(dict_name, dict()) required=nested_default_dict.keys() if len(required)>0: for dict_key in required: if dict_key not in nested_config_dict: nested_config_dict[dict_key]=nested_default_dict[dict_key] return nested_config_dict