调用不带()的函数时如何在Python中强制错误

时间:2018-10-03 13:55:14

标签: python

让我烦恼了很多次的错误是调用不带()的函数,并假设该函数在没有时就运行了。这是一个简单的场景:

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本身肯定可以通过某种方式警告我,或者在忘记()时可以强制执行错误?

2 个答案:

答案 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都没有任何理由将其视为错误,这是您作为程序员的责任确保要调用函数时应用调用运算符。