python - 具有可选参数的字典初始化的最佳样式

标签 python keyword-argument

我想要执行以下操作:

def func(name, par1=None, par2=None, par3=None, ...):
    pars = { 'name': name }
    if par1: pars['par1'] = par1
    if par2: pars['par2'] = par2
    if par3: pars['par3'] = par3
    ...
    do_something(pars)

这太冗长了。我当然可以这样做:

def func(name, **kwargs):
    pars = { 'name': name }
    pars.update(**kwargs)
    do_something(pars)

但这太晦涩了:我不知道允许使用哪些参数。唯一的方法是将它们记录在文档字符串中,但即使这样也不会阻止传递不受支持的参数。防止这种情况会使我的函数同样冗长。

我是否缺少一种明显的方法来稳健、明确地并且简短地执行此操作?

最佳答案

使用inspect给你一些非常简洁的东西:

#!/usr/bin/env python2.7
import inspect

def args_dict():
    outer_frame = inspect.currentframe().f_back
    info = inspect.getargvalues(outer_frame)
    return {
      k: info.locals[k] for k in info.args
      if info.locals[k] is not None # or modify for other falsey values
    }


def func(foo=None, bar=None, baz=None, qux='42'):
    args = args_dict()
    args['other'] = 'hello world'
    return args

print func(bar="BAR")
# prints: {'qux': '42', 'other': 'hello world', 'bar': 'BAR'}

如果您想考虑变量和关键字参数,则需要修改此参数,但从 getargvalues() 获得的 ArgInfo 元组有附加信息。

关于python - 具有可选参数的字典初始化的最佳样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32224752/

相关文章:

python - 如何防止将变量重新分配给同一类的对象以保留以前的数据?

python - 在 Python 中使用具有可变长度未命名参数的命名参数

python - 使用 kwargs 在字典中添加键和值

python - 如何将必需的关键字参数添加到派生类的构造函数?

python - **kwargs 的目的和用途是什么?

python - 为字符的矩形矩阵添加边框(*)

Python:pandas dataframe.hist 中每个直方图的标题?

python - 合并多个登录系统?

python - 将 pandas dataframe 列从十六进制字符串转换为 int

python - timeit 内的 Python 函数调用超时