用功能方法在python中修饰一个recusive方法

时间:2017-01-06 07:54:56

标签: python functional-programming

我是函数式编程的新手。为了学习它,我开始编写一个实用程序来生成无限系列。但我面临以下问题。

我有一个包装特定系列函数的系列装饰器。

from functools import partial, wraps
from itertools import imap, count

def bind(f, *args, **kwargs):
    return partial(f, *args, **kwargs)

def series(*args):
    def wrapper(func):
        @wraps(func)
        def func_wrapper():
            return imap(lambda x: bind(func, *args)(x), count(0))
        return func_wrapper
    return wrapper

@series()
def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    return fibonacci(n-1) + fibonacci(n-2)

f = fibonnaci()
next(f) # gives me 0
next(f) # gives me 1
next(f) # throws an error

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in <lambda>
  File "<stdin>", line 7, in fibonacci
TypeError: func_wrapper() takes no arguments (1 given)

我得到这个错误,在调用fibonacci函数之前,装饰器首先踢。我用以下代码修复了上述情况。

def series(*args):
    def wrapper(func):
        @wraps(func)
        def func_wrapper():
            return imap(lambda x: bind(func, *args)(x), count(0))
        func_wrapper._original = func
        return func_wrapper
    return wrapper

@series()
def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    return fibonacci._original(n-1) + fibonacci._original(n-2)

适合我。但我正在考虑更多的功能性方法,而不改变函数(斐波那契)对象。

任何人都可以帮我解决这个问题。

0 个答案:

没有答案