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 在输出中显示无效的变量名的主要内容,如果未能解决你的问题,请参考以下文章