【问题标题】:How to lint (statically analyze code for) magic numbers in Python?如何在 Python 中对幻数进行 lint(静态分析代码)?
【发布时间】:2018-10-16 23:54:00
【问题描述】:

谷歌搜索“pylint 幻数”没有返回任何有用的信息。有没有办法为magic numbers lint Python 代码?

(我输入了,但答案可以在任何 Python linter 中。)

【问题讨论】:

  • 这个问题有多普遍?浮点数和整数的简单正则表达式就足够了吗?
  • @blacksite 是的,我想这也可以。
  • 如果您还没有看到this 线程,我认为可以肯定地说PyLint 不支持它。
  • @SamGomena 实际上那个线程是我问这个问题的原因:)
  • @blacksite:仅仅用正则表达式寻找数字是行不通的。您会从 cmets 和文字字符串中的匹配中得到各种误报,这些确实浪费了您的时间。你需要一个完整的词法分析器,所以它可以准确地忽略不是数字的东西。

标签: pylint python static-analysis pylint


【解决方案1】:

最简单的方法是构建一个 Python 语言标记器,并挑选出所有的常数标记。

我们的源代码搜索引擎会从大量文件中搜索语言标记,由语言标记器驱动(它有大约 40 个,包括 Python 2 和 3)。一种是通过声明对标记序列的约束来形成查询,例如

 I=*abc* '('

意思是“查找包含字母'abc'后跟左括号标记的标识符。”并打印出找到的实例。 [此类查询会自动忽略空格和注释标记]

你想要的查询可以表述为:

 N>2

意思是,“查找值大于 2 的数字标记”假设 0 和 1 不符合魔术常数的条件。 (恕我直言,他们和其他人一样神奇,但有不同意见的余地,我想提供一个并非完全无关紧要的例子)。

您可以使用词法分析器生成器(请参阅“Flex”)复制此内容,并在顶部添加一些用于过滤数字标记的自定义代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多