Может ли функция функции объекта вызова функции Python вызвать функцию объекта объекта вызова?
Мне нужно сделать что-то функционально эквивалентное этому:
for foo in foos:
bar = foo.get_bar()
# Do something with bar
Мой первый инстинкт заключался в использовании map
, но это не сработало:
for bar in map(get_bar, foos):
# Do something with bar
Я пытаюсь сделать это с помощью map
? Нужно ли вместо этого использовать понимание списка? Какова самая питоническая идиома для этого?
Ответы
Ответ 1
либо с lambda
:
for bar in map(lambda foo: foo.get_bar(), foos):
или просто со ссылкой на метод экземпляра в вашем классе экземпляра:
for bar in map(Foo.get_bar, foos):
или с methodcaller
:
import operator
get_bar = operator.methodcaller('get_bar')
for bar in map(get_bar, foos):
или с выражением генератора:
for bar in (foo.get_bar() for foo in foos):
Ответ 2
Вы хотите operator.methodcaller()
. Или, конечно, понимание списка или генератора.
Ответ 3
Я думаю, что самый чистый способ - полностью отказаться от for
-loop и использовать понимание списка:
bars = [foo.get_bar() for foo in foos]
Этот ответ близок к некоторым другим ответам, но отличается тем, что список фактически возвращается и не используется в последующем цикле. В зависимости от того, что вы делаете с bars
, вы можете использовать там, где есть список.
Я не думаю, что функция map
с lambdas
особенно читаема, кроме того, накладные расходы для map
значительны.
Ответ 4
Этот измененный код будет работать:
for bar in map(lambda f: f.get_bar(), foos):
# Do something with bar
Здесь вы предоставляете лямбда-функцию. Простое предоставление get_bar
не работает, потому что оно доступно только через экземпляр класса (f.get_bar()
), никогда само по себе.
Ответ 5
Вы можете использовать lambda
for bar in map(lambda foo: foo.get_bar(), foos):
# Do something with bar