Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Dict as kwargs的变量比使用的多_Python_Python 3.x_Dictionary_Keyword Argument - Fatal编程技术网

Python Dict as kwargs的变量比使用的多

Python Dict as kwargs的变量比使用的多,python,python-3.x,dictionary,keyword-argument,Python,Python 3.x,Dictionary,Keyword Argument,我有一本字典,里面有几个键和它们各自的值 我希望键作为变量工作,它们的值作为每个变量的值,以便在函数中使用它们 我理解这允许我拥有一个具有任意数量参数的函数: def myFunc(**kwargs): ... myDict={ "foo1":"bar1", "foo2":"bar2", "foo3":"bar3"} def myFunc(foo1, foo2): ... myFunc(**myDict) 这让我可以使用字典中的键作为参数: def myF

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

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

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

def myFunc(**kwargs):
    ...
myDict={
   "foo1":"bar1",
   "foo2":"bar2",
   "foo3":"bar3"}

def myFunc(foo1, foo2):
   ...

myFunc(**myDict)
这让我可以使用字典中的键作为参数:

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)

怎么做呢?

我有两种方法来解决这个问题。首先,正如你所做的:

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)

那为什么不完全是这样呢?那密码怎么了?它不起作用。但最近我对python有一些奇怪的体验。也许我的安装有问题。我将重新安装并重试。使用
dict
作为
**{k:v代表k,v在d中。items()如果k在{foo1',foo2'}
中。字典是提供的,我无法更改,那么只需取出您需要的变量,您不必在此处更改字典。