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

Pas*_*ten 3 python abstract-class tornado pylint

例如:

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

它产生以下pylint错误:

warning (W0223, abstract-method, MainHandler) Method 'data_received' is abstract in 
class 'RequestHandler' but is not overridden
Run Code Online (Sandbox Code Playgroud)

我知道它不知何故它要我覆盖这个data_received方法,但我不明白为什么,它是什么?

R P*_*gna 6

这实际上是一个问题,pylint因为Python的本质是不可避免的.

RequestHandler类有很多方法可以作为可以覆盖的钩子来执行不同的操作,但实际上只能根据应用程序的代码调用其中一些钩子.为确保在实现使用某些功能时应该实现的所有内容,默认的data_received实现会抛出一个NotImplementedError当您执行期望您的类具有自定义实现的操作时将触发的实现.

通常这不是任何问题,因为Python允许您使代码路径失败并且不会引发任何错误.因为pylint试图"帮助"确保你已经完成了你应该做的所有事情,它会看到那个NotImplementedError投掷,并警告你可以根据你的工作触发它.

真正的问题是因为Python是一种解释型语言,所以很难找到一个工具pylint来查看你的代码并确保它是"安全的".Python为您提供了很大的灵活性和强大功能,但反过来您承担着将程序的逻辑直接保持在脑海中并且知道哪些问题实际上是问题,哪些不是问题的负担.

幸运的是,pylint意识到它自身的局限性,并为您提供了很好的工具来禁用无关的警告.添加评论行

# pylint: disable=W0223
Run Code Online (Sandbox Code Playgroud)

在你的类定义之前,警告应该停止弹出这个实例,同时保留其他所有内容.

  • 也可以在注释中为警告或错误编写"代码名称"而不是神秘的警告编号(_W0222_):`#pylint:disable = abstract-method`.这样,评论会提供更多信息,而无需查找警告编号. (4认同)