Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Wrappers around lambda expressions

Tags:

python

lambda

I have functions in python that take two inputs, do some manipulations, and return two outputs. I would like to rearrange the output arguments, so I wrote a wrapper function around the original function that creates a new function with the new output order

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)

However, this is giving an error message:

NameError: global name 'x' is not defined

x is an argument to a lambda expression, so why does it have to be defined?

The expected behavior is that h should be a new function that is identical to lambda x,y: (-x,-y)

like image 688
D R Avatar asked Apr 07 '26 07:04

D R


2 Answers

You need to add parentheses around the lambda expression:

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

Otherwise, Python interprets the code as:

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

and h is a 2-tuple.

like image 96
Greg Hewgill Avatar answered Apr 09 '26 23:04

Greg Hewgill


There is problem with precedence. Just use additional parentheses:

def rotate(f):
    h = lambda x,y: (-f(x,y)[1], f(x,y)[0])
    return h
like image 35
Vadim Shender Avatar answered Apr 09 '26 23:04

Vadim Shender