如何在函数参数中编写更干净的超长词典?

How to write super long dictionaries cleaner in function arguments?

我在 Python 3.6 中使用 Argh 创建一个复杂的命令行函数,但是由于我的配置文件很深,在函数中获取参数的默认值需要一长串字典键.

这看起来不是特别可读,因为有一个字典值作为另一个字典的键。它可能比嵌套更多 这个。

可以有更多像这样具有默认值的参数,所以保持这种状态很快就会变得更加混乱。这是只有一个默认参数的示例:

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

您有什么建议可以提高可读性?

我将使用与可变默认值相同的技巧。这为您提供了更多空间来编写更具可读性的内容。

@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(或任何字典)中的数据可能会在定义函数时和定义函数时发生变化它是 运行。您可以在定义函数之前执行一次字典查找以减轻这种情况。

# 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]