2012-03-24 11 views
6

Actualmente, estoy empezando a aprender haskell, y mientras lo hago, intento implementar algunas de las ideas que aprendí de Python. Pero, encontré este desafiante. Puede escribir una función en Haskell, que toma otra función como argumento, y devuelve la misma función con su orden de argumentos invertida. ¿Se puede hacer algo similar en Python? Por ejemplo,Cambiando el orden de los argumentos de una función en Python

def divide(a,b): 
    return a/b 

new_divide = flip(divide) 

# new_divide is now a function that returns second argument divided by first argument 

¿Se puede hacer esto en Python?

+1

Creo que podrías usar * args y luego reverse() esa lista de argumentos ... o algo así. –

Respuesta

11

Puede crear un cierre en Python usando definiciones de funciones anidadas. Esto le permite crear una nueva función que invierte el orden de los argumentos y luego llama a la función original:

>>> from functools import wraps 
>>> def flip(func): 
     'Create a new function from the original with the arguments reversed' 
     @wraps(func) 
     def newfunc(*args): 
      return func(*args[::-1]) 
     return newfunc 

>>> def divide(a, b): 
     return a/b 

>>> new_divide = flip(divide) 
>>> new_divide(30.0, 10.0) 
0.3333333333333333 
+0

Hmm, sí, esto debería funcionar. – yasar

+0

bueno, pero un poco detallado, ¿verdad? – georg

+2

@ thg435 Solo en el punto de definición de 'flip'. Ese tipo de verbosidad es * buena * verbosidad en mi humilde opinión, porque hace que sea obvio lo que está pasando dentro de la tapa. – Ben

6

En un estilo funcional pura:

flip = lambda f: lambda *a: f(*reversed(a)) 

def divide(a, b): 
    return a/b 

print flip(divide)(3.0, 1.0) 

ejemplo un poco más interesante:

unreplace = lambda s: flip(s.replace) 

replacements = ['abc', 'XYZ'] 
a = 'abc123' 
b = a.replace(*replacements) 
print b 
print unreplace(b)(*replacements) # or just flip(b.replace)(*replacements) 
+5

¡NO, eso no es justo! La respuesta de @Raymond es en realidad mucho mejor desde el punto de vista práctico, ya que mantiene los rastros de pila legibles. Quien lea este hilo debe leer su respuesta primero. Por favor, vuelva a recibir – georg

Cuestiones relacionadas