我想从lambda函数返回一个比较函数,并根据输入的类型使用它。有办法吗?
def p12(p):
f = lambda p: compare_nr if type(p) == int else compare_str
return f
if __name__ == '__main__':
cmp1 = p12(0)
cmp1(2,3)
cmp2 = p12('')
cmp2('Mississippi','fall')
答案 0 :(得分:1)
有一种方法可以在不使用lambda
:functools.singledispatch
的情况下(在Python 3中)。有了这个,您可以创建single-dispatch generic function:
一种通用函数调度形式,其中选择了实现 基于单个参数的类型。
[强调我的]
它根据第一个参数的 type
向函数添加重载实现,幸运的是,p12
函数只接受一个参数。
from functools import singledispatch
@singledispatch
def p12(p):
...
@p12.register(int)
def _(p):
'''compare integers'''
...
@p12.register(str)
def _(p):
'''compare strings'''
...
p12(0) # calls integer dispatch
p12('') # calls string dispatch
您仍然可以为其他Python类型添加更多候选函数来重载p12
。
答案 1 :(得分:0)
遇到的问题是我返回了实际的 lambda 函数,而不是定义的函数。
def p12(p):
f = lambda p: compare_nr if type(p) == int else compare_str
#here was the problem
#return f
return f(p)
if __name__ == '__main__':
cmp1 = p12(0)
cmp1(2,3)
cmp2 = p12('')
cmp2('Mississippi','fall')
答案 2 :(得分:0)
您也可以使用更高阶函数替换lambda并执行相同的操作。
def p12(p):
if type(p) == int :
return compare_nr
else:
return compare_str
if __name__ == '__main__':
cmp1 = p12(0)
cmp1(2,3)
cmp2 = p12('')
cmp2('Mississippi','fall')