具有固定输入的函数的dict

时间:2013-07-19 10:29:45

标签: python

我有一些函数,我想通过字典调用,但传递固定值。

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中带有固定参数的键指定的函数?

3 个答案:

答案 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;该模块已包含doSumdoProd函数:

>>> 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}