基于正则表达式的Linter

rebl的Python项目详细描述


欢迎使用rebl-一个基于正则表达式的Linter

为了提高代码质量,linter是非常有用的工具。然而,它们的行为通常是固定的或难以扩展。在

虽然可以使用grep来扫描一个文件中的模式,但是当扫描一个文件中的许多模式时,这要么很慢(因为每个模式扫描一次文件),要么无法维护(因为模式变得非常非常长)。在

rebl是一个小的短绒,它试图平衡grep的简单性和常规短绒的有用性。在

正则表达式不适合处理语言语法吗?在

当然。这个linter是在充分理解基于行的正则表达式有这样的局限性的基础上开发的。这个linter坚定地打算用20%的工作量提供80%的可用性。在

你需要知道的东西

这个linter的模式配置文件是一个python模块。你为什么要在意?有两个原因-

  • 文件保存在它自己的目录中,并且
  • 该目录还应该包含一个空的__init__.py文件。在

默认的模式配置文件保存在(path of rebl)/.reblrc/config.py中,但将搜索其他路径(见下文)。在

有两种方法可以重写默认路径;一种是在命令行中指定--config=/absolute/path/to/config.py。另一种方法是有一个名为.reblrc的文件,其中包含--config=relative/path/to/config.py。请注意,如果在当前工作目录中找不到文件.reblrc,则rebl将在父目录中查找。如果在任何地方找不到.reblrc文件,则继续检查进一步的路径。relative/path/to/config.py与找到.reblrc文件的目录有关。在

如果没有指定模式配置,rebl将查找模式配置

  • 在当前工作目录中,然后检查父目录(项目-或多项目配置-可能会命中用户的主目录)
  • 在rebl程序目录中(用户范围配置)
  • /etc/rebl/config.py(即系统范围的配置)

模式配置示例

为了方便起见,在这个存储库的.reblrc目录中提供了一个示例模式配置。提供了一个符号链接_reblrc,使其可见。在

配置示例:

patterns = {}
patterns['.py'] = {
  "HW0025": (
    "No need for exc_info when using log.exception",
    ["log.exception", "exc_info"],[],[] ),
}

在哪里

  • .py是应用模式的文件扩展名

  • HW0025是模式键,对于每个模式必须是唯一的第一个字符是置信度(HML表示高、中、低)第二个字符是错误级别(EWI表示错误、警告、信息)下一组数字是其余模式的唯一标识符

  • 下一行给出的字符串是用户友好的linter消息,1行

  • 下一行有3个列表,分别是“all of”、“any of”和“none of”列表。在

    当一行标志

    • 它匹配“all of”列表中的所有regex
    • 它与“any of”列表中的任何regex匹配
    • 它不匹配“none-of”列表中的所有regex。在

    正则表达式是自动锚定的。在

    这意味着模式hello将匹配包含单词“hello”的任何行—它将自动重写为"^.*hello.*$",使rebl的行为更像{}。在

高级检测

所有列表、任何列表和任何列表都不能组合。在

如果这还不够,如果这三个列表都是空的,rebl将查找一个名为detect_[ext]_[pattern key]的函数,该函数接受文件名和行参数,例如

^{pr2}$

将为每一行调用

  • 匹配时返回True;或
  • 如果不匹配,则返回False。在

定影器

如果函数fix_[ext]_[pattern key]存在,则可以使用它来 批量执行修复。 例如

def fix_py_MW0049(filename, line):
    return line.replace("import csv", "import unicodecsv as csv")

如果rebl--fix一起运行并且行与为模式键MW0049给定的模式匹配,则将自动调用。在

行钩子/上下文收集器

可以定义一个行钩子来收集每行的上下文,例如

def linehook_<ext>(filename, lines, linenum, context):

如果defined允许收集状态数据,比如当前函数名、在thusfar中发现的错误,那么将在每一行上调用它。在

由于linehook经常被调用,理想情况下应该保持轻巧;也就是说,尽量避免在这里出现太多的循环。在

状态应该保持在dict中context-这个dict会重置每个文件。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java通过Spring MVC web应用程序向客户端发送文本文件   java是否可以在运行时动态实例化DAO类?   调用VB。来自Java的net函数   java在Android中通过单击打开特定文件夹   java如何使用maven pom。xml标识非标准项目结构中的testng测试用例?   java为什么FOP在大文件上崩溃?   Architecture python+flask和spring boot+java   java Kafka工具根本没有启动Ubuntu 19.10   如何使用Eclipse运行Java USB API for Windows   java如何在Eclipse中查看J2EE预览服务器/容器的日志/控制台?   网页抓取是否可以使用Java crawler crawler4j暂停和恢复抓取?   java当我第二次按下按钮时,应用程序停止工作   带有偏移量和限制的java SQLite分页问题   java如何在OSX mavericks中将端口80转发到8080   java从泛型方法调用非泛型方法   java My代码未按预期工作。十进制输出不是它应该的样子   节点。java中的js加密(jasypt)和nodejs中的解密   java乘法表不工作数组索引超出范围   java将JDBC与Firebirdsql连接起来