Pylint C0103(无效命名)错误疑问:类私有变量符合Python规范却被判定命名无效?
别慌,这不是Pylint的bug,是你可能没注意到它的命名规则细节!
首先得理清两个关键点:Python的命名约定和Pylint的检查规则是有细微差异的,先掰扯清楚:
- 在Python里,我们说的「私有字段」其实分两种:
- 单下划线开头的
_xxx:这是约定俗成的protected属性(外部能访问,但大家默认不去碰); - 双下划线开头的
__xxx:这才是真正的私有属性(Python会自动做名字修饰,外部直接访问不到)。
- 单下划线开头的
- 而Pylint对这两种属性的检查规则是分开的:
- 普通属性/protected属性(单下划线开头)的默认规则是
_[a-z_][a-z0-9_]*——简单说就是下划线开头,后面跟着小写字母/下划线,再后面随便加小写字母、数字、下划线都行; - 你报错里的
[a-z_][a-z0-9_]{0,30}$其实是普通变量/非protected属性的检查规则,按道理不该用到你的单下划线属性上。
- 普通属性/protected属性(单下划线开头)的默认规则是
那为什么你会触发这个报错?大概率是这几个原因:
- 你的Pylint配置被修改过:如果你的项目里有
.pylintrc配置文件,可能有人把protected-attr-rgx(专门管单下划线属性的规则)改成了普通属性的规则,导致Pylint用错了检查逻辑。你可以运行pylint --generate-rcfile导出默认配置,对比一下本地配置里的这个选项。 - 你用的是旧版本Pylint:有些老版本的Pylint对protected属性的识别不够准确,会误把单下划线开头的属性当成普通属性来检查。试试把Pylint更新到最新版本,这个问题很可能就消失了。
- 变量名有隐性问题:虽然你描述的
_expected_substring_result看起来没问题,但不妨再仔细检查一遍——有没有不小心加了大写字母?有没有特殊字符?长度是不是真的没超过30?(数了下你的名字才26个字符,肯定没问题,但万一你实际写的不一样呢?)
如果以上都排查过还是有问题,那才有可能是Pylint的边缘情况bug,但这种概率极低。这时你用# pylint: disable=invalid-name临时跳过检查完全没问题,也可以去Pylint的GitHub仓库提交issue反馈细节。
内容的提问来源于stack exchange,提问作者Nimrod Fiat
相关产品推荐
相关产品推荐

