【问题标题】:Pylint complains about method 'data_received' not overridden, for RequestHandlerPylint 抱怨 RequestHandler 的方法“data_received”没有被覆盖
【发布时间】:2015-08-11 10:20:34
【问题描述】:

例如:

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

它会产生以下 Pylint 错误:

警告 (W0223, abstract-method, MainHandler) 方法“data_received”在“RequestHandler”类中是抽象的,但未被覆盖

我知道它以某种方式希望我覆盖这个 data_received 方法,但我不明白为什么,它的用途是什么?

【问题讨论】:

    标签: python abstract-class tornado pylint


    【解决方案1】:

    这实际上是 Pylint 的一个问题,这在 Python 的本质上是不可避免的。

    RequestHandler 类有很多作为钩子的方法,您可以覆盖这些钩子来做不同的事情,但实际上只有一些钩子可能会被调用,具体取决于您的应用程序的代码。为了确保您在使用某些功能时实现了您应该实现的所有功能,默认的 data_received 实现 throws a NotImplementedError 在您执行期望您的类具有自定义实现的操作时将被触发。

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

    真正的问题在于,由于 Python 是一种解释型语言,因此像 Pylint 这样的工具很难查看您的代码并确保其“安全”。 Python 为您提供了很大的灵活性和强大的功能,但反过来,您需要承担将程序逻辑直接记在脑海中的负担,并知道哪些可能的问题实际上是问题,哪些不是。

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

    # pylint: disable=W0223
    

    就在你的类定义之前,警告应该停止弹出这个实例,而别管其他一切。

    【讨论】:

    • 除了神秘的警告编号 (W0222) 之外,还可以在评论中写下警告或错误的“代码名称”:# pylint: disable=abstract-method。这样评论就可以提供更多信息,而无需查找警告编号。
    • 我把建议的# pylint: disable=W0223 放在我的继承 tornado.web.Request 的类之​​前,但是警告仍然存在,例如,我的类名仍然用警告“Class XyzRequestHandler must implement all abstract方法”
    • 哈,问题解决了,我的错,详情见我的回答,希望对使用Pycharm的亲们自己检查有帮助
    【解决方案2】:

    我遇到了与 OP 相同的问题,除了我的 PyCharm (2018.3.4) 似乎没有使用 Pylint,而是使用它自己的检查引擎。我设法用与R Phillip Castagna suggested 类似的技巧解决了类似的问题:

    # 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-05
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 2019-03-31
      • 2011-02-23
      相关资源
      最近更新 更多