Pylint无效的常量名称


78

我收到有关我的常量的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

Answers:


108

在检查名称时,Pylint会区分常量,变量,类等。不在函数/类内部的任何名称都将被视为常量,其他任何东西都是变量。

参见http://docs.pylint.org/features.html#basic-checker

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

const-rgx:
(([A-Z_][A-Z0-9_]*)|(__.*__))$

因为您在函数中,MIN_SOIL_PARTICLE_DENS所以(根据pylint)应该是变量,因此pylint会将其视为常量,因此会抱怨。

这意味着在没有pylint抱怨的情况下,函数中不能有任何大写名称。


如果您问我,使用大写内部函数就可以了;并非所有常量都必须全局定义。


7
如果它是常量,那么为什么要为每次对此方法的调用重新分配其值?可以在此方法之外定义。
MaximeChéramy2014年

2
@Maxime我的想法是使方法独立(不需要外部常量),即使由于常量的重新分配可能会导致性能下降。好点。
gcamargo 2014年

@ user2457899实际上,我也在方法中使用了常量。我只是在试图表达这种卑鄙规则背后的想法。:)
MaximeChéramy2014年

1
我不知道,我想我想在函数之外有常量。如果它不是一个真正的全局常量,则应该是一个变量。
瑞克·亨德森

@MaximeChéramy您能表达为什么func_name = make_func(1,2,3)认为错误的想法吗?当前用例vlen = numpy.vectorize(len)在utils模块中,可与h5py中的破烂数组一起使用
AnnanFay

1

几个简单的规则:

  1. 常量UPPER_CASE只能用字母定义,并且应该在模块级别定义
  2. 类名应该用CamelCase字母定义
  3. 变量应lower_case在函数,类等处定义,并应在函数,类等内部定义。

现在让我们谈谈您的情况,

MIN_SOIL_PARTICLE_DENS在函数内部定义,并且只能使用小写字母。因此MIN_SOIL_PARTICLE_DENS,pylint不是将其视为常量,而是在此处将其视为变量,因此将pylint错误。

Pylint教程


0

我发现这种行为很烦人,但是有一种方法可以配置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_]+$)

我通过建立这个正则表达式

|加上一些括号。

从理论上讲,您也可以使用.*,但这甚至允许使用无效名称,例如mixed_CASE

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.