如何告诉PyLint“这是一个变量,而不是一个常量”来停止消息C0103?


72

我的Python 2.6程序中有一个名为“ _log”的模块级变量,PyLint抱怨:

C0103: Invalid name "_log" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)

阅读了这个答案后,我了解了为什么这样做:它认为变量是一个常量,并应用了常量正则表达式。但是,我希望有所不同:我认为这是一个变量。我该如何告诉PyLint,以便它不会抱怨?PyLint如何确定它是变量还是常量-它将所有模块级变量都视为常量吗?

Answers:


99
# pylint: disable-msg=C0103

将其放在希望忽略这些警告的范围内。您也可以将以上内容作为行尾注释,以仅针对该代码行禁用该消息。

IIRC确实pylint会将所有模块级变量解释为“常量”。

较新版本的pylint会改用此行

# pylint: disable=C0103

8
谢谢。# pylint: enable-msg=C0103之后,我也添加了代码,以便其余代码仍得到检查。
EMP

15
请注意,将其放在代码行的末尾也应仅对此特定行禁用此消息(然后无需重新启用)。
ChristopheD

2
为了在所有Python源文件中禁用此错误消息,我将该代码放在哪里?
renatov

IIRC it is true that pylint interprets all module-level variables as being 'constants'.-为什么他们仍然不让Pylint区分variableconstants?是否存在任何技术挑战?
Jai K

@JaiK好吧,Python中的常量和(其他)变量之间没有技术上的区别,所以我想不出更好的方法来区分这两个……
lenz

23

您还可以指定一个用逗号分隔的“好名”列表,这些列表始终在您的pylintrc中允许,例如:

[BASIC]
good-names=_log

17

在我看来,一些重构可能会有所帮助。Pylint将其视为一个模块,因此不要期望看到此级别的变量是合理的。相反,它不会抱怨类或函数中的var。以下范例似乎很常见,可以解决此问题:

def main():
    '''Entry point if called as an executable'''
    _log = MyLog()  # . . .

if __name__ == '__main__':
    main()

这样的好处是,如果您有一些有用的类,则可以在不运行main的情况下将其导入。该__name__是模块的这样的“如果”失败。


3
并非所有程序都是具有主要功能的脚本,例如Django urls.py文件。
andyn

1
此变量仅存在于函数中。这不是模块级变量。
Craynic Cai

12

在更新版本的pylint中,此行现在

# pylint: disable=C0103

启用消息很简单

# pylint: enable=C0103

3

如其他答案所示,您可以通过包含以下行来禁用特定的PyLint警告(例如C0103):

# pylint: disable=C0103

但这会生成Locally disabling invalid-name警告。请注意,如果您想提醒禁用的警告,则此辅助警告可能很有用。如果要在不更改配置文件的情况下静默禁用警告(这将全局禁用警告),则可以使用:

# pylint: disable=I0011,C0103

请注意,PyLint不会发出警告,表明您正在禁用I0011!


2

如果您在文件本地禁用消息,则Pylint将报告另一个不同的警告!

Locally disabling invalid-name (C0103) [I:locally-disabled] 

如果您打算干净运行,并且肯定是目标,否则您会感到烦恼,那么可以在配置文件中禁用该消息和相应的本地启用的消息:

disable=locally-disabled, locally-enabled
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.