我有一本有几个键及其各自值的字典。
我希望键可以用作变量,并且其值可以用作每个变量的值,以便在函数中使用它们。
我知道这使我可以使用带有任意数量参数的函数:
def myFunc(**kwargs):
...
这使我可以使用字典中的键作为参数:
myDict={
"foo1":"bar1",
"foo2":"bar2",
"foo3":"bar3"}
def myFunc(foo1, foo2):
...
myFunc(**myDict)
我的问题是我有3个带有相等参数的函数,但它们也有自己的参数。
如果我的字典具有一些在每个函数中都不会使用的键,那么我该如何使用字典作为我所有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)
怎么办?
答案 0 :(得分:2)
我有两种方法可以解决此问题。首先,就像您所做的一样:
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
定义一个函数,然后仅 提取函数中需要的内容,而忽略其他所有内容。
另一种方法是在函数签名 plus 伪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
,这是有意的。
答案 1 :(得分:2)
怎么办?
这是错误的API。不要这样除非有确凿的理由接受**kwargs
(例如,您必须将它们传递到其他地方,并且事先不知道这里可能有哪些关键字),否则函数应该对输入明确。
如果我的字典具有一些在每个函数中都不会使用的键,那么我该如何使用字典作为我所有3个函数的参数。
使用具有所有参数(foo1,foo2)的交集的字典,而不是使用包含所有参数的联合的字典(foo1-foo5)。分别传递其他参数:
fun1(foo5=x, **common)
fun3(foo3=y, **common)