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

Ran*_*Rag 51 python pylint

我制作了一个简单的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
Run Code Online (Sandbox Code Playgroud)

现在我想让我们用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
Run Code Online (Sandbox Code Playgroud)

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

完整的pylint输出.

Chr*_*tts 53

由于您的代码未包含在类或函数中,因此期望这些变量是常量,因此它们应该是大写的.

您可以阅读PEP8以获取更多信息.

  • Pep 8并不禁止全局变量......这样做是愚蠢的,因为python经常被用来编写短脚本.这显然是pylint加入PEP 8中不存在的限制的情况. (30认同)
  • @Kroltan在"全局变量"部分中,PEP8表示全局变量应该像函数一样格式化,因此ALL_CAPS是错误的.我的猜测是pylint很难检查变量是用作常量还是变量,所以它默认只允许模块级常量,因为通常不鼓励全局变量,你可以在一个案例中禁用pylint-他们的个案基础. (6认同)
  • 更特别是PEP8的[命名约定部分](http://www.python.org/dev/peps/pep-0008/#naming-conventions) (5认同)
  • @catphive pylint也不禁止它们,只需要它们遵循ALL_CAPS命名约定. (4认同)
  • 我不会在类中编写它,我只是将它放在函数定义中,这也是代码重用的好习惯. (2认同)

msv*_*kon 22

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

来自Pylint 的开发人员.

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

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


rub*_*bik 6

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