Изменение порядка аргументов функции в Python

В настоящее время я начинаю изучать haskell, и пока я делаю это, я пытаюсь реализовать некоторые идеи, которые я извлек из него, в Python. Но я нашел это сложным. Вы можете написать функцию в Haskell, которая принимает другую функцию в качестве аргумента и возвращает ту же функцию с измененным порядком ее аргументов. Можно ли сделать что-то похожее на 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

Можете ли вы сделать это в Python?

2 ответа

Решение

Вы можете создать замыкание в Python, используя определения вложенных функций. Это позволяет вам создать новую функцию, которая меняет порядок аргументов и затем вызывает исходную функцию:

>>> 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

В чистом функциональном стиле:

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

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

print flip(divide)(3.0, 1.0)

Немного более интересный пример:

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)
Другие вопросы по тегам