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

时间:2015-08-11 10:20:35

标签: python abstract-class tornado pylint

例如:

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方法,但我不明白为什么,它是什么意思?

2 个答案:

答案 0 :(得分:6)

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

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

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

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

幸运的是,pylint知道自己的局限性,并为您提供了很好的工具来禁用无关的警告。添加评论专栏

# pylint: disable=W0223

在您的类定义之前,警告应该停止为此实例弹出,同时保留其他所有内容。

答案 1 :(得分:1)

首先,感谢 R Phillip Castagna 的回答,为我指明了正确的方向。

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

# 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 insepctions。希望这对那些与我的设置相同的人有所帮助。

相关问题