代码之家  ›  专栏  ›  技术社区  ›  PascalVKooten

Pylint抱怨RequestHandler的方法“data_received”未被重写

  •  6
  • PascalVKooten  · 技术社区  · 11 年前

    例如:

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

    它产生以下Pylint错误:

    警告(W0223,抽象方法,MainHandler)方法“data_received”在类“RequestHandler”中是抽象的,但未被重写

    我知道它想让我超越这个 data_received 方法,但我不明白为什么,它是为了什么?

    2 回复  |  直到 11 年前
        1
  •  8
  •   Peter Mortensen Pieter Jan Bonestroo    4 年前

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

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

    通常这不是什么问题,因为Python允许您拥有失败的代码路径,并且不会抛出任何错误。因为皮林特试图“帮助”确保你完成了你应该做的一切,所以它看到了这一点 未实现错误 投掷,并警告你,你可能会根据你的行为触发它。

    真正的问题是,因为Python是一种解释语言,所以像Pylint这样的工具很难查看代码并确保其“安全”。Python为您提供了很多灵活性和功能,但反过来,您要承担保持程序逻辑清晰的责任,并知道哪些可能的问题实际上是问题,哪些不是问题。

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

    # pylint: disable=W0223
    

    就在您的类定义之前,该实例的警告应该停止弹出,而其他所有内容都不受影响。

        2
  •  3
  •   Peter Mortensen Pieter Jan Bonestroo    4 年前

    我遇到了与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 .

    推荐文章