让我烦恼了很多次的错误是调用不带()的函数,并假设该函数在没有时就运行了。这是一个简单的场景:
class testDoubling:
def __init__(self, x):
self.x = x
def update(self):
self.x *= 2
现在在我的代码中初始化:
myval = testDoubling( 2 )
然后在我的代码后面,我调用以下命令,期望它使存储的参数加倍:
myval.update
Python可以愉快地运行而不会抱怨,但是不会更新myval.x。当我用括号调用它时,它只会更新myval.x:
myval.update()
我代码中的这个潜伏错误使我损失了很多时间。我的IDE或python本身肯定可以通过某种方式警告我,或者在忘记()时可以强制执行错误?
答案 0 :(得分:1)
简而言之,你不能。
在您的代码的这一行
myval.update
它应该返回函数对象本身而不执行,因此这不是错误,并且您的IDE对此也无能为力
别忘了“()”很重要。
这里是您的代码...
In [1]: class testDoubling:
...: def __init__(self, x):
...: self.x = x
...: def update(self):
...: self.x *= 2
In [2]: myval = testDoubling( 2 )
In [3]: myval.update
Out[3]: <bound method testDoubling.update of <__main__.testDoubling object at 0x103766048>>
In [4]: myval.x
Out[4]: 2
答案 1 :(得分:0)
Python函数(和方法)也是对象... myval.update
是一个完全有效的Python表达式,它在对象myval
上查找名称“ update”。该名称被解析为类update
的{{1}}函数,并包装在testDoubling
对象中(因此调用时不必显式传递method
作为参数) ),而且,由于您没有对其进行任何处理,因此将其丢弃,但是您可能希望将其存储在某个地方以备将来使用,并将其作为回调等传递给另一个函数,等等。
IOW只是另一个对象,并且有很多用例来传递函数或方法。或者,您实际上可以只调用它,这是通过应用调用运算符myval
完成的。 FWIW,您的问题的标题在技术上是错误的-您无法“在没有()的情况下调用函数”,因为“()”是调用运算符。
请注意,函数也不是唯一可调用的对象-我们已经提到了方法(实际上也是()
的评估对象),但是也有类(是的,Python类也是对象-Python中的所有内容都是对象),您也可以编写自己的可调用类型。
TL; DR:在不调用函数或方法的情况下完全调用它是合法的,合法的,并且实际上是一个非常常见的习惯用法,Python和您的IDE都没有任何理由将其视为错误,这是您作为程序员的责任确保要调用函数时应用调用运算符。