Pylint 抱怨方法 'data_received' 没有被覆盖,对于 RequestHandler

Pylint complains about method 'data_received' not overridden, for RequestHandler

例如:

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render('data.html', items = [])

它产生以下 Pylint 错误:

warning (W0223, abstract-method, MainHandler) Method 'data_received' is abstract in class 'RequestHandler' but is not overridden

我明白它想让我覆盖这个 data_received 方法,但我不明白为什么,它有什么用?

这实际上是 Pylint 的一个问题,根据 Python 的性质,这是不可避免的。

RequestHandler class 有许多方法可以作为挂钩,您可以重写这些挂钩以执行不同的操作,但实际上可能只调用其中一些挂钩,具体取决于您的应用程序代码。为确保您在使用某些功能时实现了您应该做的一切,默认的 data_received 实现 throws a NotImplementedError 将在您执行期望 class 的操作时触发有一个自定义实现。

通常这不是任何类型的问题,因为 Python 允许您有失败的代码路径并且不会抛出任何错误。因为 Pylint 试图“帮助”确保你已经完成了你应该做的一切,它看到 NotImplementedError 抛出并警告你你可以根据你所做的事情触发它。

真正的问题是,因为 Python 是一种解释型语言,所以像 Pylint 这样的工具很难查看您的代码并确保它“安全”。 Python 为您提供了很大的灵活性和能力,但反过来您也承担了将程序逻辑牢记在心并知道哪些可能的问题实际上是问题,哪些不是的负担。

幸运的是,Pylint 了解其自身的局限性,并为您提供了很好的工具来禁用无关警告。添加注释行

# pylint: disable=W0223

就在您的 class 定义之前,此实例的警告应该停止弹出,而其他一切都保持不变。

我 运行 遇到了与 OP 相同的问题,除了我的 PyCharm (2018.3.4) seems not to be using Pylint, but its own inspection engine. I managed to solve a similar issue with the similar trick as :

# noinspection PyAbstractClass
class XyzRequestHandler(tornado.web.RequestHandler):
    def prepare(self):
        print('-' * 100)
        self.set_header('Access-Control-Allow-Origin', '*')

    def print_n_respond(self, result):
        response = json.dumps(result)
        print('responding with:\n', response)
        print()
        self.write(response)

这里是a list of PyCharm's inspections