夸克词多于使用量

时间:2018-12-04 18:31:03

标签: python python-3.x dictionary kwargs

我有一本有几个键及其各自值的字典。

我希望键可以用作变量,并且其值可以用作每个变量的值,以便在函数中使用它们。

我知道这使我可以使用带有任意数量参数的函数:

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)

怎么办?

2 个答案:

答案 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)