我可以在不使用lambda
关键字的情况下以某种方式引用方法吗?
假设我们有以下示例代码:
class AbstractDummy:
def size(self):
raise NotImplementedError
class Dummy1(AbstractDummy):
def size(self):
return 10
class Dummy2(AbstractDummy):
def size(self):
return 20
如果我有我的示例对象:
dummies1 = [Dummy1(), Dummy1(), Dummy1()]
dummies2 = [Dummy2(), Dummy2()]
然后,如果我想map
它们,我可以使用提取的函数参数来为我节省一些字符:
f = lambda x : x.size()
map(f, dummies1)
map(f, dummies2)
这里的问题:我可以以某种方式避免这个临时f
和/或lambda
关键字吗?
为了做一个小的比较,在 Java 中可以引用AbstractDummy::size
,因此调用看起来有点像print(map(AbstractDummy::size, dummies1)
。
operator
模块为此提供了methodcaller
。
from operator import methodcaller
f = methodcaller('size')
results1 = [f(x) for x in dummies1]
results2 = [f(x) for x in dummies2]
虽然[x.size() for x in ...]
更简单,就像C_Z_的回答一样。methodcaller
对于需要函数作为函数参数时很有用,例如
# Sort some_list_of_objects on return value of each object's `a` method.
sorted_list = sorted(some_list_of_objects, key=methodcaller('a'))
在这种情况下,您可能希望使用列表推导式
[x.size() for x in dummies1]
[x.size() for x in dummies2]