如何创建一个接受字典输入的函数?
How to create a function that takes dictionary inputs?
我正在为一个项目使用一个模块,我必须将一个函数传递给该模块,而该模型会执行如下操作:
class module:
def __init__(self, function, dictionary):
# dictionary is {'x':2, 'y':4, 'z':23}
function(**dictionary)
我的函数是这样的:
def function(*foo):
return sum(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())
double * 解压字典值,一个 * 解压任何东西(字典除外)。
参数的数量和类型由函数init的代码决定
在您的情况下,这是一个字典类型的参数。所以你必须总是传递这样的函数 f(x) 其中 x 是一个字典。
所以这就是处理参数的函数 f。
例如
def fsum(x): return sum(x.values())
...
__init__(fsum, {'a': 1, 'b': 2, 'c': 3})
您无法更改的模块正在调用您的函数:
function(**dictionary)
您将无法将您的函数写入参数是一个列表——它没有被传递给一个列表。您可以将关键字作为字典接受,并轻松制作列表。您的函数只需要准备好以这种方式调用:
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
我正在为一个项目使用一个模块,我必须将一个函数传递给该模块,而该模型会执行如下操作:
class module:
def __init__(self, function, dictionary):
# dictionary is {'x':2, 'y':4, 'z':23}
function(**dictionary)
我的函数是这样的:
def function(*foo):
return sum(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())
double * 解压字典值,一个 * 解压任何东西(字典除外)。
参数的数量和类型由函数init的代码决定 在您的情况下,这是一个字典类型的参数。所以你必须总是传递这样的函数 f(x) 其中 x 是一个字典。 所以这就是处理参数的函数 f。 例如
def fsum(x): return sum(x.values())
...
__init__(fsum, {'a': 1, 'b': 2, 'c': 3})
您无法更改的模块正在调用您的函数:
function(**dictionary)
您将无法将您的函数写入参数是一个列表——它没有被传递给一个列表。您可以将关键字作为字典接受,并轻松制作列表。您的函数只需要准备好以这种方式调用:
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