Подтвердить что ты не робот

Может ли функция функции объекта вызова функции 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? Нужно ли вместо этого использовать понимание списка? Какова самая питоническая идиома для этого?

4b9b3361

Ответ 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