Мне предоставлена сторонняя функция mk_config
, которая дает мне объекты в соответствии с (key, configs)
. Типичное использование: когда вам нужны некоторые из этих объектов, вы говорите
args = mk_config('args', **configs)
validator = mk_config('validator', **configs)
postproc = mk_config('postproc', **configs)
, а затем работаете с указанными объектами.
Поскольку мне не нравится видеть большие блоки шаблонов, я думаю, хорошо, может быть лучше следующее:
def mk_configs_tuple(keys, **configs):
return [mk_config(k, **configs) for k in keys]
args, validator, postproc = mk_configs_tuple(
['args', 'validator', 'postproc'],
**configs)
Но все же есть повторение имен клавиш, и если иметь дело с 20, это может выйти из-под контроля. Я мог бы ввести их в locals()
, чтобы они были СУХИМИ, но большинство скажет, что это тоже dry, поэтому я думаю, что могу сделать это:
def mk_configs_dict(keys, **configs):
return {k: mk_config(k, **configs) for k in keys}
m = mk_configs_dict(['args', 'validator', 'postproc'], **configs)
assert list(m) == ['args', 'validator', 'postproc']
Теперь словари работают быстро, но не всегда хорошо автопредлагает в среде IDE, и гораздо сложнее написать ['']
, чем .
(как JSON). Итак, я думаю:
def mk_config_obj(keys, **configs):
class ConfigObj: ...
config_obj = ConfigObj()
for key in keys:
setattr(config_obj, key, mk_config(key, **configs))
return config_obj
config_obj = mk_config_obj(['args', 'validator', 'postproc'], **configs)
assert {'args', 'validator', 'postproc'}.issubset(dir(config_obj))
Но потом я думаю, что если я не могу сделать это с тем, что python приходит естественно, я чего-то упускаю.