import yaml class ConfigWrapper: def __init__(self, config_path): self._config = {} with open(config_path, 'r') as file: self._config = yaml.safe_load(file) for key, value in self._config.items(): setattr(self, key, value) def __setattr__(self, key, value): if key.startswith('_'): super().__setattr__(key, value) else: self._config[key] = value super().__setattr__(key, value) def __getattr__(self, key): if key in self._config: return self._config[key] raise AttributeError( f"'ConfigWrapper' object has no attribute '{key}'") def get_id(self, data): if isinstance(self._config.get('id_key'), str): return data.get(self._config.get('id_key'), None) elif isinstance(self._config.get('id_key'), list): return '_'.join([ str(data[key]) for key in self._config.get('id_key') if key in data ]) def print_all_keys(self): print('config keys:') for key, value in self._config.items(): print(f' - {key}: {value}') config_wrapper = None def initialize_config(config_path): global config_wrapper config_wrapper = ConfigWrapper(config_path) def get_config_wrapper(): global config_wrapper if config_wrapper is None: raise RuntimeError( 'ConfigWrapper not initialized. Call initialize_config first.') return config_wrapper if __name__ == '__main__': config_path = 'config/config.yaml' initialize_config(config_path) data = { 'idx': '50', 'step': 21, 'question': 'Ciphertext: "17,156,4,54,213,17,23,84,228,54,281"\n\n' 'Please provide the decrypted answer, encapsulated in double square' ' brackets. For example, the format should be: [[decrypted answer]].', 'answer': '[[P]]', 'category': 'Decryption', 'rule_id': '23', 'input': 'Ciphertext: "17,156,4,54,213,17,23,84,228,54,281"', 'steps_num': 23, 'description': 'For a number c=228 in the ciphertext:\n' 'Calculate z = c^e mod n. Here ^ means multiplication.\nz is 80.' '\nBased on the decimal number represented by z, use the ascii ' 'code to find the corresponding letter as the plaintext letter p.' '\nPlease give the letter p in [[...]] format.\n', 'atom': 80, } print(config_wrapper.get_id(data))