2010-08-31 7 views
3

J'ai des fonctions en python qui prennent deux entrées, font des manipulations et retournent deux sorties. Je voudrais réorganiser les arguments de sortie, j'ai donc écrit une fonction wrapper autour de la fonction originale qui crée une nouvelle fonction avec le nouvel ordre de sortieEnveloppes autour des expressions lambda

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) 

Cependant, cela génère un message d'erreur:

NameError: global name 'x' is not defined 

x est un argument à une expression lambda, alors pourquoi doit-il être défini?

Le comportement attendu est que h devrait être une nouvelle fonction qui est identique à lambda x,y: (-x,-y)

+1

Puisque vous nommez vos fonctions (c'est-à-dire qu'elles ne sont pas anonymes), j'éviterais d'utiliser 'lambda' et d'utiliser' def' à la place. [Les formes Lambda] (http://docs.python.org/tutorial/controlflow.html#lambda-forms) sont pour de petites fonctions * anonymes *. –

Répondre

7

Vous devez ajouter des parenthèses autour de l'expression lambda:

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

Sinon, Python interprète le code comme:

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

et h est un 2- tuple.

5

Il y a un problème prioritaire. Il suffit d'utiliser entre parenthèses supplémentaires:

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