我是函数式编程的新手。为了学习它,我开始编写一个实用程序来生成无限系列。但我面临以下问题。
我有一个包装特定系列函数的系列装饰器。
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)
适合我。但我正在考虑更多的功能性方法,而不改变函数(斐波那契)对象。
任何人都可以帮我解决这个问题。