什么是python中的_curried方法,它们是如何生成的?

时间:2015-02-05 19:56:49

标签: python django

  

如果这是一个骗局,请提前道歉;我搜索" _curried python"并得到了14个结果,然后简单_curried"而这只能达到33个结果,似乎没有任何帮助......

问题:我遇到了我原本认为今天代码库中的拼写错误,这里是嫌疑人:

student.recalculate_gpa()

现在,我怀疑这是一个错字,因为student是没有Student方法的recalculate_gpa类的实例。但是,它确实有calculate_gpa方法:

class Student(User):
    ...
    def calculate_gpa(self):
        # some calculations...

(其中User是标准的django用户类。)但是,代码没有错误,这对我没有意义。所以我做了检查,发现了这个:

... (a bunch of methods)
('calculate_gpa', <unbound method Student.calculate_gpa>),
... (some more methods)
('recalculate_gpa', <unbound method Student._curried>),

奇怪,recalculate_gpa 实际上是一种方法。但它究竟来自哪里呢?我为&#34; _curried&#34;在我们的代码库中找不到任何东西,所以这必须是一些与Django相关的行为。当然,我希望在我们项目的某个地方,我们已经描述了动态命名函数是如何形成的,因为recalculate似乎是calculate的合理衍生物,但老实说我不知道​​从哪里开始寻找。

因此,我的问题是:如何生成如上所述的curried方法,以及我应该从哪里开始寻找我们自己的代码库如何进行讨论?

提前感谢!

1 个答案:

答案 0 :(得分:5)

curried方法是指在实际调用方法之前部分调用方法

例如

from functools import partial
from itertools import count
def my_pow(x,y):
    return x**y

curried_pow2n = partial(my_pow,x=2)

for i in count(0): #print the 2**i
    print curried_pow2n(i)

你也可以用lambda

轻松实现它
curried_pow2n = lambda x:return my_pow(2,x)

虽然我不确定这与您的实际问题有什么关系 ...

django还提供了一种非常类似于functools.partial

的咖喱方法
from django.utils.functional import curry    

lols = {'lols':'lols'}
formset = modelformset_factory(MyModel, form=myForm, extra=0)
formset.form = staticmethod(curry(MyForm, lols=lols))

(来自https://stackoverflow.com/a/25915489/541038

因此您可能希望查找Student.recalculate_gpa =

或可能在Student.__init__

self.recalculate_gpa =方法中

您可能不会发现它正在寻找def recalculate_gpa