如何在函数参数中编写超长字典清理器?

时间:2017-05-19 15:18:34

标签: python argh

我在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

您建议如何使其更具可读性?

2 个答案:

答案 0 :(得分:1)

我只是使用与可变默认值相同的技巧。这为您提供了更多可读性的空间。

@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

答案 1 :(得分:1)

为什么要在一行:

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]