Обертки вокруг лямбда-выражений - PullRequest
3 голосов
/ 01 сентября 2010

У меня есть функции в python, которые принимают два входа, выполняют некоторые манипуляции и возвращают два вывода.Я хотел бы переставить выходные аргументы, поэтому я написал функцию-обертку вокруг исходной функции, которая создает новую функцию с новым порядком вывода

def rotate(f):
    h = lambda x,y: -f(x,y)[1], f(x,y)[0]
    return h

f = lambda x, y: (-y, x)
h = rotate(f)

Однако это выдает сообщение об ошибке:

NameError: global name 'x' is not defined

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

Ожидаемое поведение таково, что h должна быть новой функцией, идентичной lambda x,y: (-x,-y)

Ответы [ 2 ]

7 голосов
/ 01 сентября 2010

Вам необходимо добавить скобки вокруг лямбда-выражения:

h = lambda x,y: (-f(x,y)[1], f(x,y)[0])

В противном случае Python интерпретирует код как:

h = (lambda x,y: -f(x,y)[1]), f(x,y)[0]

и h - это два кортежа.

5 голосов
/ 01 сентября 2010

Есть проблема с приоритетом.Просто используйте дополнительные скобки:

def rotate(f):
    h = lambda x,y: (-f(x,y)[1], f(x,y)[0])
    return h
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...