我有一些函数,我想通过字典调用,但传递固定值。
def doSum(a,b):
print a+b
def doProd(a,b):
print a*b
如果我通过
传递输入d = {'sum': doSum,'prod':doProd}
d['prod'](2,4)
一切正常并打印8。
但如果我尝试类似
的话d = {'sum': doSum(2,4),'prod':doProd(2,4)}
d['prod']
它打印6和8.如何更改代码,以便它只运行我用dict中带有固定参数的键指定的函数?
答案 0 :(得分:3)
使用functools.partial()
存储带默认值的函数以传入。
您仍然需要调用该函数:
from functools import partial
d = {'sum': partial(doSum, 2, 4),'prod': partial(doProd, 2, 4)}
d['sum']()
调用时,partial
对象将转向并调用包装函数,传入已使用partial
存储的参数,以及传入的任何其他参数:
>>> addtwo = partial(doSum, 2)
>>> addtwo(6)
8
>>> addtwo(4)
6
最后但并非最不重要的是,看看operator
module;该模块已包含doSum
和doProd
函数:
>>> import operator
>>> operator.add(2, 4)
6
>>> operator.mul(2, 4)
8
这些函数返回结果而不是打印值。在上面的例子中,是python交互式解释器来代替打印。
答案 1 :(得分:3)
作为Martijn's anwser的“老派”替代品,你也可以使用lambda函数:
d = {
"sum": lambda: doSum(2, 4),
"prod": lambda: doProd(2, 4),
}
d["sum"]()
答案 2 :(得分:1)
6和8的印刷实际上是在创建字典时完成的:
>>> d = {'sum': doSum(2,4),'prod':doProd(2,4)}
6
8
因为此时执行了这些功能。然后对d['prod']
的调用什么都不做,因为这里的值是None
(因为函数doProd
没有返回任何内容)。
如果您打印字典,您将拥有:
>>> print d
{'sum': None, 'prod': None}