我想要执行以下操作:
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/