Предотвращение ненужного использования лямбды для вызова методов объекта

1

Рассмотрим следующий код, который просто вызывает метод для каждого члена списка:

class Demo:
    def make_change(self):
        pass

foo = [Demo(), Demo(), Demo()]
map(lambda x: x.make_change(), foo)

Есть ли способ выполнить это без синтаксиса синтаксиса lambda? Например, в Scala работает нечто подобное map(_.make_change(), foo). Имеет ли Python эквивалент?

  • 0
    Гнибблер поднял вопрос о том, что использование Python для побочных эффектов не является питоническим. Давайте предположим, что make_change не имеет побочных эффектов, а вместо этого возвращает то, что я хочу собрать в виде списка.
Теги:

4 ответа

5
Лучший ответ

Не очень pythonic использовать карту только для побочных эффектов

так почему бы не

for item in foo:
    item.make_change()

Это будет работать быстрее, чем использование карты

вы можете поместить его на одну строку, если вы настаиваете, но я бы не

for item in foo:item.make_change()
2
operator.methodcaller('make_change')
0

Как насчет синтаксиса генератора?

>>> [x.make_change() for x in foo]
[None, None, None]

(где None исходит из того факта, что нет возвращаемого значения в классе примера, конечно.)

0

Я с гнибблером на питоничность. Кроме того, это также возможно:

map(Demo.make_change, foo)

У него есть проблемы:

class Demo(object):
    def __init__(self):
        self.x = 1
        self.y = 2
    def make_change(self):
        self.x = 5

class SubDemo(Demo):
    def make_change(self):
        self.y = 7

d = Demo()
s = SubDemo()
map(Demo.make_change, [d, s])

assert d.x == 5 and s.y == 7 # oops!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню