Dict as kwargs包含的变量比使用的变量多



我有一个字典,里面有几个键和它们各自的值。

我希望键作为变量工作,它们的值作为每个变量的值在函数中使用。

我知道这允许我拥有一个具有任意数量参数的函数:

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)

最新更新