问题描述:
在 Python-2.x 中,如果你想声明一个新式类,你必须显式继承自object,如下所示:
class A(object):
def __init__(self, prop):
self.prop = prop
在 Python-3.x 中,类被隐式声明为继承object自,你可以简单地写:
class A:
def __init__(self, prop):
self.prop = prop
但是,类声明的两种变体都可以在 3.x 中使用。
问题:
是否有可能在静态代码分析和诸如 之类的工具的帮助下pylint,flake8禁止类声明的第一个过时版本?
请不要过于严厉地判断 - 这是我在 en.SO 上的第一个问题。
首先,让我们手动检查一下,以便大致了解 PyLint 到底做了什么。要检查的文件示例(让它成为
tester.py):现在是一个将检查源代码的脚本示例:
结果:
该脚本以文本形式打开模块,然后将其转换为抽象语法树 (AST),您已经可以使用这棵树了。Pylint 的工作方式大致相同,但使用NodeVisitor遍历树。此访问者在找到元素时调用某些方法。例如,
visit_classdef遇到类定义时调用。visit_callfunc遇到函数调用时调用。等等 - 常量、assert数学运算以及语言中的所有内容。为了给pylint自己附加一个时髦的东西,你需要编写如下类(pylint_plugin.py 文件):文档
pylint不亮,所以我不完全确定插件的正确性,它被写成“只是为了工作”(唉)。为了自己编写,您将需要以下内容(所有内容均在https://pylint.readthedocs.io/en/latest/reference_guide/custom_checkers.html中进行了描述):register(linter)会告诉你使用额外检查的函数。必须linter.register_checker为所有附加检查调用此函数。实际上,这些类是跳棋(访问者)。这些类必须定义:
name)——实际上是检查的名称。priority)必须小于零。msgs。该词典应具有以下结构:msgs = {'message-id': ('displayed-message', 'message-symbol', 'message-help')}.message_id必须是唯一的,并且不与现有的冲突。它由标识符 - 组成C, W, E, F, R,意思是Convention - соглашение, Warning - предупреждение, Error - ошибка, Fatal - ужасная ошибка and Refactoring - переделать。此外,message_id 由一个 4 位数字组成。我见过的几乎所有项目都使用自己的某种类型BASE_ID和消息编号。那。message_id限制为 5 个字符。为什么这样做是不可思议的。visit_<node_name>我们需要检查类及其后代的定义 - 所以让我们这样做吧。在函数本身中,您需要注意它pylint使用的不是本机模块ast,而是模块astroid以及相应的所有节点astroid。如果所有这些都完成了,插件就准备好了,可以这样调用:
最后会有这样的报告:
2 个坏类 - 如上所述。