2个代码块的比较 - 区别是什么?

时间:2014-04-03 08:51:21

标签: python python-2.7

所以,我正在研究一些试图解决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>

我知道没有括号会返回一个指向函数的指针,但是当它在逻辑操作中完成时,该函数应该在之后立即执行,因此两个代码块的最终结果应该是相同的。有时确实如此。但有时它并不是出于某种原因,在每次执行代码时总是在同一个迭代的子代中。

如果有人能够解释可能导致问题的原因,我会非常感激。

编辑: 谢谢大家的帮助。旧代码显然是错误的。我不知道它过去是如何运作的。

1 个答案:

答案 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

没有打印,因为我的示例函数没有返回任何内容。在您的情况下,当您使用大括号调用时,您的函数的返回值将用于比较。