如何在没有关键字的情况下将方法作为函数参数传递'lambda'?



我可以在不使用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]

最新更新