所以,我正在研究一些试图解决bug的代码。这是最初的代码块:
passrate = 90
for child in sorted_children:
if child.passrate >= passrate:
return child
return None
此代码有问题,这是它的修复:
passrate = 90
for child in sorted_children:
if child.passrate() >= passrate:
return child
return None
唯一的区别是添加的括号。因此,child
是一个类,而passrate()
是它的延迟加载并返回它的__passrate
值的方法。如果尚未计算,则会在返回之前对其进行计算。
当我使用调试器来查看导致问题的原因时,我发现有时当passrate()
执行时,它就像代码执行某种程度上最终出现在一个完全错误的子类实例中。 / p>
我知道没有括号会返回一个指向函数的指针,但是当它在逻辑操作中完成时,该函数应该在之后立即执行,因此两个代码块的最终结果应该是相同的。有时确实如此。但有时它并不是出于某种原因,在每次执行代码时总是在同一个迭代的子代中。
如果有人能够解释可能导致问题的原因,我会非常感激。
编辑: 谢谢大家的帮助。旧代码显然是错误的。我不知道它过去是如何运作的。
答案 0 :(得分:1)
我认为,根据python的规则,如果它的方法,那么它应该用大括号调用。如果它是一个属性,那么你可以不用括号打电话如下:
class Hello(object):
@property
def hi(self):
print "hello"
def hifunc(self):
print "Hi function"
h=Hello()
print h.hi
print h.hifunc
print h.hifunc()
输出:
hello
None
<bound method Hello.hifunc of <__main__.Hello object at 0x0000000002B99358>>
Hi function
None
没有打印,因为我的示例函数没有返回任何内容。在您的情况下,当您使用大括号调用时,您的函数的返回值将用于比较。