[Django学习]curry函数

转载自limodou的学习记录

[Django学习]curry函数

仔细看 django 的代码可以发现许多的好东西.这不本文将讲一个curry的函数.不知道怎么翻译为好.它位于 django/utils/functional.py.函数的定义为:

def curry(*args, **kwargs):
    def _curried(*moreargs, **morekwargs):
        return args[0](*(args[1:]+moreargs), **dict(kwargs.items() + morekwargs.items()))
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参数和关键字参数.

不过它使用起来还是有一定的限制,主要是它的参数处理.从上面的源代码可以看到,它对于tuple参数和字典参数是不能混在一起的.特别是对于 tuple参数,它是采用追加的方法,因此预设参数时只能是从前向后,中间不能跳跃.比如你想预设上面的a, c参数,但是做不到,其实还是预设了a,b参数.而对于字典参数却没有关系.

这里要注意的是,所谓字典参数就是指有缺省值的参数.

你可能感兴趣的:(python,函数,包装)