Pylint 在输出中显示无效的变量名

Posted

技术标签:

【中文标题】Pylint 在输出中显示无效的变量名【英文标题】:Pylint showing invalid variable name in output 【发布时间】:2021-12-29 16:13:47 【问题描述】:

我制作了一个简单的 python 脚本来在网站上发布数据。

#Imports

url_to_short = sys.argv[1]

post_url = 'https://www.googleapis.com/urlshortener/v1/url'
headers = 'Content-Type': 'application/json'

data = 'longUrl': url_to_short
post_data = json.dumps(data)

req = urllib2.Request(post_url, post_data, headers)
resp = urllib2.urlopen(req)

if resp.getcode() == 200:  
    content = json.loads(resp.read())

#Other stuff

现在我想用pylint 工具检查我的脚本的编码标准。

我的pylint输出如下:

************* Module post
C:  1,0: Missing docstring
C:  6,0: Invalid name "url_to_short" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
C:  8,0: Invalid name "post_url" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
C:  9,0: Invalid name "headers" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)

# Other stuff

现在,我的问题是为什么 pylint 将我的变量名显示为 Invalid name。以这种方式命名变量是否是错误的编码约定。

我的complete pylint output。

【问题讨论】:

【参考方案1】:

这是因为url_to_short是在全局命名空间中声明的,而pylint需要将全局变量(例如常量)命名为ALL_UPPERCASE。 因此它会检查您的变量名称是否与用于全局变量的正则表达式匹配,即:(([A-Z_][A-Z0-9_]*)|(__.*__))$(注意A-Z 范围)。因此出现Invalid name 错误。

【讨论】:

【参考方案2】:

编辑:正如其他人所提到的,pylint 期望全局变量应该是大写的。如果警告真的困扰你,你可以通过在main()-function 中包装像这样的小sn-ps 来规避它们,然后使用if __name__ == "__main__"-convention。或者,如果您愿意,可以修改 pylint 用于验证变量名的正则表达式。

来自 Pylint 的developers。

在这种情况下,Pylint 告诉我这些变量似乎是常量,应该全部大写。该规则实际上是 Logilab 中创建 Pylint 的人员所特有的命名约定。这就是他们选择命名这些变量的方式。您也可以创建自己的内部命名约定,但出于本教程的目的,我们希望坚持 PEP-8 标准。在这种情况下,我声明的变量应该遵循所有小写的约定。适当的规则类似于:“应该匹配 [a-z_][a-z0-9_]2,30$”。注意正则表达式中的小写字母(a-z 与 A-Z)

你可以通过运行来测试它: pylint --const-rgx='[a-z_][a-z0-9_]2,30$' x.py

【讨论】:

【参考方案3】:

由于您的代码不包含在类或函数中,因此期望这些变量为constants,因此它们应为大写。

您可以阅读PEP8 了解更多信息。

【讨论】:

尤其是PEP8的naming conventions part 我不会把它写在一个类中,我只会把它放在一个函数定义中,这也是代码重用的好习惯。 Pep 8 不禁止全局变量...这样做是愚蠢的,因为 python 经常用于编写短脚本。这显然是 pylint 设置 PEP 8 中不存在的限制的情况。 @catphive pylint 也不禁止它们,它只是要求它们遵循 ALL_CAPS 命名约定。 @Kroltan 在“全局变量”部分,PEP8 说全局变量应该像函数一样格式化,所以 ALL_CAPS 是错误的。我的猜测是,pylint 很难检查变量是用作常量还是变量,因此它默认只允许模块级常量,因为通常不鼓励使用全局变量,并且您可以在 case- 上禁用 pylint以个案为基础。

以上是关于Pylint 在输出中显示无效的变量名的主要内容,如果未能解决你的问题,请参考以下文章

readelf -s 不输出完整的变量名

matlab 批量运算命名变量

SHELL基础知识

Z-ORA-01745:无效的主机/绑定变量名 (PLSQL)

pylint之代码静态检查

bash中的变量