我有一个字典,里面有几个键和它们各自的值。
我希望键作为变量工作,它们的值作为每个变量的值在函数中使用。
我知道这允许我拥有一个具有任意数量参数的函数:
def myFunc(**kwargs):
...
这让我可以使用字典里的密钥作为论据:
myDict={
"foo1":"bar1",
"foo2":"bar2",
"foo3":"bar3"}
def myFunc(foo1, foo2):
...
myFunc(**myDict)
我的问题是,我有三个函数的自变量相等,但它们也有自己的自变量。
如果字典中有一些键不会在每个函数中使用,那么我如何将字典用作所有3个函数的参数呢。
类似这样的东西:
myDict={
"foo1":"bar1",
"foo2":"bar2",
"foo3":"bar3",
"foo4":"bar4",
"foo5":"bar5"}
def fun1(**kwargs):
#takes foo1, foo2 and foo5 as args
def fun2(**kwargs):
#takes foo1, foo2 and foo4 as args
def fun3(**kwargs):
#takes foo1, foo2 and foo3 as args
fun1(**myDict)
fun2(**myDict)
fun3(**myDict)
如何做到这一点?
我有两种方法来解决这个问题。首先,正如你所做的:
def fun1(**kwargs):
#takes foo1, foo2 and foo5 as args
foo1 = kwargs.get("foo1")
foo2 = kwargs.get("foo2")
foo5 = kwargs.get("foo5")
# do something with foo1, foo2, foo5
您用kwargs
定义了一个函数,只获取函数内部所需的,而忽略其他所有内容。
另一种方法是在函数签名加上一个伪kwargs
:中准确定义您需要的内容
def fun1(foo1=None, foo2=None, foo5=None, **kwargs):
#takes foo1, foo2 and foo5 as args
# do something with foo1, foo2, foo5
在这两种方式中,您都可以使用fun1(**myDict)
调用函数。只有后者才会触发来自静态分析器的警告,即您有未使用的变量kwargs
,这是有意的。
如何做到这一点?
这是一个糟糕的API。不要这样做。函数应该明确输入,除非有充分的理由接受**kwargs
(例如,你必须将它们传递到其他地方,而且你事先不知道这里可能的关键字是什么(。
如果字典中有一些键不会在每个函数中使用,我如何使用字典作为所有3个函数的参数。
不要使用一个所有参数(foo1-foo5(的并集字典,而是使用一个包含所有参数(foo1,foo2(交集的字典。单独传入其他参数:
fun1(foo5=x, **common)
fun3(foo3=y, **common)