如果这是一个骗局,请提前道歉;我搜索" _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方法,以及我应该从哪里开始寻找我们自己的代码库如何进行讨论?
提前感谢!
答案 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