Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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 如何创建接受字典输入的函数?_Python_Python 3.x_Arguments_Argument Unpacking - Fatal编程技术网

Python 如何创建接受字典输入的函数?

Python 如何创建接受字典输入的函数?,python,python-3.x,arguments,argument-unpacking,Python,Python 3.x,Arguments,Argument Unpacking,我正在为一个项目使用一个模块,我必须将一个函数传递给该模块,该模型执行如下操作: 类模块: 定义初始化(self、函数、字典): #字典是{'x':2,'y':4,'z':23} 函数(**字典) 我的函数是这样的: def函数(*foo): 回报金额(foo) 问题是,模块需要命名变量,并将其像未打包的字典一样传递给函数,dictionary中的元素数可以是变量,因此我无法将函数预写为def function(x,y,z):return sum(x,y,z),这会引发错误。我不想修改模块,

我正在为一个项目使用一个模块,我必须将一个函数传递给该模块,该模型执行如下操作:

类模块:
定义初始化(self、函数、字典):
#字典是{'x':2,'y':4,'z':23}
函数(**字典)
我的函数是这样的:

def函数(*foo):
回报金额(foo)
问题是,模块需要命名变量,并将其像未打包的字典一样传递给函数,
dictionary
中的元素数可以是变量,因此我无法将函数预写为
def function(x,y,z):return sum(x,y,z)
,这会引发错误。我不想修改模块,因为这样代码就不会通用。如何通过更改代码来解决此问题


编辑:我需要
foo
作为函数中使用的列表

似乎您需要以下值的总和:

   def __init__(self, function, dictionary):
       # dictionary is {'x':2, 'y':4, 'z':23}
       function(dictionary.values())
dictionary.values()
将为您的示例提供一个
[2,4,23]
列表

def function(*args,**Kwargs):
    try:
        return sum(*args)
    else:
        return sum(**kwargs.values())

双*解包字典值,一*表示解包任何东西(字典除外)。

参数的数量和类型由函数代码init 在您的例子中,这是一个dictionary类型的单参数。所以你必须传递这样的函数f(x),其中x是一个字典。 这就是处理参数的函数f。 例如


您无法更改的模块正在使用以下命令调用函数:

function(**dictionary)
如果参数是一个列表,则无法将函数写入,因为它没有被传递列表。您可以接受关键字作为dict,并且可以轻松地创建一个列表。您的函数只需准备好以这种方式调用即可:

def f(**foo):
这导致:

class module:
    def __init__(self, function, dictionary):
       # dictionary is {'x':2, 'y':4, 'z':23}
       function(**dictionary)

def f(**foo):
    print(sum(foo.values()))

module(f, {'x':2, 'y':4, 'z':23})

# prints 29 as expected

\uuuu init\uuuu
的第一个参数始终是
self
。我想您还没有理解,我无法编辑模块。因此,您无法更改
模块
,您可以更改
函数
?是的,我可以更改
函数
,然后查看Mark Myer的解决方案
class module:
    def __init__(self, function, dictionary):
       # dictionary is {'x':2, 'y':4, 'z':23}
       function(**dictionary)

def f(**foo):
    print(sum(foo.values()))

module(f, {'x':2, 'y':4, 'z':23})

# prints 29 as expected