LINUX.ORG.RU

python: создание анонимной функции


0

0

Господа, есть ли более элегантный вариант создания анонимной функции в данной программе, 
возвращающей список, чем использование __make_lambda()?
Интересует именно наполнение списка glb такими функциями.

glb = list()

def make_clist(lst):
    def __make_lambda(arg):
        return (lambda: arg)

    for item in lst:
        glb.append(__make_lambda(item))
    
    return

if "__main__" == __name__:
    make_clist(((1, 2, 3), (4, 5, 6)))
    print glb[0](), glb[1]()

В случае с s/__make_lambda(item)/lambda: item/g, естественно, 
получаем (4, 5, 6) (4, 5, 6) в выхлопе, что не соответствует желаемому.
Спасибо.
★★★

> Господа, есть ли более элегантный вариант создания анонимной функции в данной программе

Нет, если не считать, например, такого варианта:

glb = list()

def make_clist(lst):
    for item in lst:
        glb.append(lambda x = item: x)
    
    return

if "__main__" == __name__:
    make_clist(((1, 2, 3), (4, 5, 6)))
    print glb[0](), glb[1]()

Но за ткое следует расстреливать^W бить по рукам. За твой оригинальный код, пожалуй, тоже.

tailgunner ★★★★★
()

Вы хотите чего странного. Лучше так не делать вообще. Какая задача стоит? Ее наверняка можно достигнуть не магическими методами.

anonymous
()

> Но за ткое следует расстреливать^W бить по рукам. За твой оригинальный код, пожалуй, тоже.

Абсолютно согласен. Это всего-лишь игрушка для проверки некой концепции в реализации.

> Какая задача стоит? Ее наверняка можно достигнуть не магическими методами.


Создание стопки get()'ов для динамически-генерящихся виджетов. Но это другая, уже решенная, история.

Спасибо за помощь. Вопрос снят.

kondor ★★★
() автор топика
Ответ на: комментарий от tailgunner

> Но за ткое следует расстреливать^W бить по рукам

почему? Сама идея создания такого кол-ва анонимных функций говорит о неправильном API или что?

И почему все пишут return, хотя функция и так вывалится? :)

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

>> Но за ткое следует расстреливать^W бить по рукам

>почему?

Потому что параметры по умолчанию во вложенных лямбдах - это более глубокая магия, чем та, которую разрешает использовать Инквизиция :D Кроме того, я не уверен, что эта фича определена в стандарте языка.

> И почему все пишут return, хотя функция и так вывалится? :)

Может, чтобы вернуть значение или выйти, не выполнив последующих операторов? ;)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Может, чтобы вернуть значение или выйти, не выполнив последующих операторов? ;)

так у вас никаких операторов дальше нет. Или это для красоты добавлено? Что говорит по этому поводу GvR? :)

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

>> Может, чтобы вернуть значение или выйти, не выполнив последующих операторов? ;)

> так у вас никаких операторов дальше нет

Это не у меня, а у топикстартера :) Я сделал минимальное исправление для получения работоспособной программы.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>Нет, если не считать, например, такого варианта:

glb=[(lambda x=item: x) for l in ((1, 2, 3), (4, 5, 6))) for item in l]

DonkeyHot ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.