Pylint 无效的常量名

80 投票
3 回答
97698 浏览
提问于 2025-04-18 16:24

我在使用 Pylint 的时候遇到了一个错误,提示我的常量:MIN_SOIL_PARTICLE_DENS(名字不合法)。有没有人知道为什么这个常量会出错?下面是我的完整函数:

def bulk_density(clay, sand, organic_matter):
    MIN_SOIL_PARTICLE_DENS = 2.65
    x1 = (0.078 + 0.278 * sand + 0.034 * clay + 0.022 * organic_matter - 0.018
          * sand * organic_matter - 0.027 * clay * organic_matter - 0.584 * sand
          * clay)
    x2 = -0.107 + 1.636 * x1
    field_capacity = vol_water_content_33_j_kg(clay, sand, organic_matter)#m3/m3
    sat_water_content = 0.043 + field_capacity + x2 - 0.097 * sand
    return (1 - sat_water_content) * MIN_SOIL_PARTICLE_DENS

3 个回答

1

我觉得这个行为挺烦人的,不过有办法可以设置pylint来避免这个问题!

你可以把下面这个ini格式的设置合并到你的.pylintrc文件里:

[BASIC]
variable-rgx=((([a-z_][a-z0-9_]{2,})|(_[a-z0-9_]*)|(__[a-z][a-z0-9_]+__))$)|([A-Z_][A-Z0-9_]+$)

我这个正则表达式是通过以下方式构建的:

  • 的源代码中获取的默认蛇形命名(snake_case)正则表达式,具体在这一行

  • 的源代码中获取的默认常量变量(CONST_VAR)正则表达式,具体在这一行

然后把它们用|和一些括号连接起来。

理论上,你也可以直接用.*,但这样会允许一些不合法的名字,比如mixed_CASE

1

几个简单的规则:

  1. 常量应该用全大写字母来定义,并且要在模块的最外层定义。
  2. 类名应该用驼峰式命名法,也就是每个单词的首字母都要大写。
  3. 变量应该用小写字母来定义,并且要在函数、类等内部定义。

现在我们来谈谈你的情况,

MIN_SOIL_PARTICLE_DENS是在一个函数内部定义的,应该只用小写字母。因此,pylint并没有把MIN_SOIL_PARTICLE_DENS当作常量,而是当作变量来处理,所以才会出现pylint的错误。

Pylint教程

110

在检查名字的时候,Pylint会区分常量、变量、类等等。任何不在函数或类里的名字都会被认为是常量,而其他的则被视为变量。

你可以查看这个链接了解更多信息:http://docs.pylint.org/features.html#basic-checker

变量的规则:
[a-z_][a-z0-9_]{2,30}$

常量的规则:
(([A-Z_][A-Z0-9_]*)|(__.*__))$

因为你在一个函数里,所以MIN_SOIL_PARTICLE_DENS(根据Pylint的说法)应该是一个变量,但Pylint却把它当成常量来处理,因此会发出警告。

这意味着在函数内部,如果你使用大写字母的名字,Pylint就会发出警告。


如果你问我的话,我觉得在函数里使用大写字母是没问题的;并不是所有的常量都一定是全局定义的。

撰写回答