pylint全局变量命名报错:仅playing变量不符合规范的原因及最佳实践
报错原因
- 该报错是pylint的自定义检查规则触发,不属于PEP8的强制要求。PEP8仅建议代码中不会被修改的常量使用全大写下划线分隔的命名风格,未对所有全局变量的命名做强制约束。
- pylint默认会将模块顶层(类、函数之外的全局作用域)定义的变量识别为常量,要求符合全大写的命名规范。你定义的
suits、ranks、values未触发报错,是因为这三个变量初始化后没有被修改,属于实际意义上的常量,你的命名如果符合常量规则就不会触发检查,或者你的pylint配置对仅初始化一次的全局变量放宽了校验。 playing变量后续会被修改状态,pylint检测到这个被标记为常量的变量存在修改操作,就会触发命名不合规的报错。即便你将其放入类中,如果是作为类属性而非实例属性定义,pylint也会将类属性识别为类常量,同样会触发报错。
最佳实践
- 方案1:将游戏逻辑封装为函数,把
playing作为局部变量使用,完全规避全局常量检查,同时避免全局变量污染,是最推荐的写法。示例代码:
def run_game(): # 常量可以放在函数内部,也可以放在模块顶层用全大写命名 SUITS = ('Hearts', 'Diamonds', 'Spades', 'Clubs') RANKS = ('Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine','Ten', 'Jack', 'Queen', 'King', 'Ace') VALUES = {'Two':2, 'Three':3, 'Four':4, 'Five':5, 'Six':6, 'Seven':7, 'Eight':8, 'Nine':9, 'Ten':10, 'Jack':10, 'Queen':10, 'King':10, 'Ace':11} while True: playing = True # 游戏逻辑实现 if this_happens: playing = False break if __name__ == "__main__": run_game()
- 方案2:使用类封装游戏逻辑,将
playing定义为实例属性,在__init__方法中初始化,pylint不会对实例属性做全大写要求。示例代码:
class CardGame: # 类常量使用全大写命名,符合规范 SUITS = ('Hearts', 'Diamonds', 'Spades', 'Clubs') RANKS = ('Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine','Ten', 'Jack', 'Queen', 'King', 'Ace') VALUES = {'Two':2, 'Three':3, 'Four':4, 'Five':5, 'Six':6, 'Seven':7, 'Eight':8, 'Nine':9, 'Ten':10, 'Jack':10, 'Queen':10, 'King':10, 'Ace':11} def __init__(self): self.playing = True def run(self): while True: self.playing = True # 游戏逻辑实现 if this_happens: self.playing = False break
- 方案3:如果不想调整代码结构,可以直接在
playing变量定义行添加忽略注释,跳过当前行的命名检查:
playing = True # pylint: disable=invalid-name
- 方案4:也可以修改pylint配置文件,添加
good-names=playing将该名称加入合法命名白名单,不过不推荐这种全局调整的方式,容易屏蔽其他正常的命名合规报错。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

