Как написать супер длинные словари чище в аргументах функции?
Я использую Argh в Python 3.6 для создания сложной функции командной строки, но из-за моего глубокого файла конфигурации получение значения по умолчанию для аргумента в функции занимает длинную строку словарных ключей.
Это не выглядит особенно читабельным, поскольку в качестве ключа другого словаря используется значение словаря. Это может стать еще более вложенным, чем это.
Может быть больше аргументов со значениями по умолчанию, подобными этим, так что продолжение этого будет еще более запутанным. Это пример с одним аргументом по умолчанию:
import argh
import config
@arg('-v', '--version')
def generate(
kind,
version=config.template[config.data['default']['template']]['default']['version']):
return ['RETURN.', kind, version]
Значение по умолчанию для аргумента версии получено из моего модуля конфигурации, который генерирует много данных в форматах списка и словаря. Чтобы попытаться лучше объяснить значение по умолчанию:
config.template[ # dictionary containing variables for a particular template
config.data['default']['template'] # the default template name set in the main configuration
]['default']['version'] # The default version variable within that particular template
Что вы рекомендуете сделать это более читабельным?
2 ответа
Я бы просто использовал тот же трюк, используемый для изменяемых значений по умолчанию. Это дает вам больше возможностей для написания чего-то более читабельного.
@arg('-v', '--version')
def generate(kind, version=None):
if version is None:
d = config.data['default']['template']
version = config.template[d]['default']['version']
return ['RETURN.', kind, version]
Одним из недостатков является то, что это технически отличается, так как данные в config.data
(или любой из этих диктовок) может меняться между определением функции и ее выполнением. Вы можете выполнить поиск dict один раз, прежде чем функция будет определена, чтобы смягчить это.
# Choose whatever refactoring looks good to you
default_template = config.data['default']['template']
default_version = config.template[default_template]['default']['version']
@arg('-v', '--version')
def generate(kind, version=default_version):
return ['RETURN.', kind, version]
del default_template default_version # Optional
Зачем это делать в одной строке:
default_template_id = config.data['default']['template']
default_template = config.template[default_template_id]
default_version = default_template['default']['version']
def generate(kind, version=default_version):
return ['RETURN.', kind, version]