我想要完成的事情:
dct = {'foo':0, 'bar':1, 'baz':2}
def func(**dct):
pass
#function signature is now func(foo=0, bar=1, baz=2)
但是,** 语法显然在扩展 dict(我想做的)和声明包含关键字参数的参数(我不想做的)之间发生冲突。
这可能吗?
根据我对您的要求的解释——您希望动态定义一个函数,其签名与dict
运行时提供的内容相匹配——这里有两个问题使其不切实际。
dict
s 是无序的,因此您不能可靠地使用它们来定义位置参数我怀疑这是一个XY 问题。如果您可以解释您要达到的目标,那么也许我们可以提供更好的帮助。
但是,假设您尝试使用dict
一种方法来分配默认关键字参数来实现这一点,那就是使用decorators。例如:
def defaultArgs(default_kw):
"decorator to assign default kwargs"
def wrap(f):
def wrapped_f(**kwargs):
kw = {}
kw.update(default_kw) # apply defaults
kw.update(kwargs) # apply from input args
f(**kw) # run actual function with updated kwargs
return wrapped_f
return wrap
然后,您可以使用此装饰器将默认关键字参数分配给只需要关键字参数的函数:
defaults = {'foo':0, 'bar':1, 'baz':2}
@defaultArgs(defaults)
def func(**kwargs):
print kwargs # args accessible via the kwargs dict
结果:
func() # prints {'baz': 2, 'foo': 0, 'bar': 1}
func(foo=2) # prints {'baz': 2, 'foo': 2, 'bar': 1}
params = {'bar':1000, 'hello':'world'}
func(**params) # prints {'baz': 2, 'foo': 0, 'bar': 1000, 'hello': 'world'}
请注意,您将无法使用位置参数:
func(1, 2, 3) # raises TypeError
我真的不确定你打算在这里完成什么。以下作品(某种):
def func(**dct):
pass
dct = {'foo':0, 'bar':1, 'baz':2}
func(**dct)
如果它们是动态创建的foo
,您打算如何使用bar
或在函数中使用?baz
如果您提供更多有关您实际尝试完成的任务的详细信息,我们可能会提供更多帮助。
我相信你想要的是eval()
链接