在Django/utils/functional.py文件中,我发现了一个之前从没有见过的函数的写法,源代码如下:
def curry(_curried_func, *args, **kwargs):
def _curried(*moreargs, **morekwargs):
return _curried_func(*args, *moreargs, **{**kwargs, **morekwargs})
return _curried
它的工作就是一个decorator的方式.它的主要作用是将原函数预置一些参数,然后返回一个新函数.这样新函数只需要传入原来没有预设的参数.
这样在某些情况下可以简化一些处理.特别是有时为了通用我们定义了一个函数有许多的参数,但调用者却只使用几个参数进行调用,特别多的是在GUI编程中的事件处理方法中.为了在事件处理中使用这个多参数的函数,使用curry可以解决这个问题.
给出一个例子:
from django.utils.functional import curry
def A(a, b, c):
print(a, b, c)
b = curry(A, 'a', 'b')
b('c')
结果为: a b c
第一个参数是一个函数对象,需要传入的是一个函数,后面要传入的是不定长的tuple和不定长的dict。
不过它使用起来还是有一定的限制,主要是它的参数处理.从上面的源代码可以看到,它对于tuple参数和字典参数是不能混在一起的.特别是对于tuple参数,它是采用追加的方法,因此预设参数时只能是从前向后,中间不能跳跃.比如你想预设上面的a, c参数,但是做不到,其实还是预设了a,b参数.而对于字典参数却没有关系。
网友评论