Python3.9升级后出现DeprecationWarning:私有变量将在3.10变为普通属性的咨询
Python 3.9升级后双下划线类方法的DeprecationWarning问题
问题背景
负责维护的代码库从Python 3.7升级到3.9后,执行部分Python工具时出现了关于双下划线开头类方法的DeprecationWarning。查阅Python版本更新文档后仍未明确警告的具体含义和解决办法,且不想查看CPython源码。涉事代码由他人编写,原作者已无法联系,本人从不使用下划线成员控制可见性。涉事代码示例如下:
class Cmd(Enum): ... @classmethod def __call_set(cls, # << 此处触发警告 ...): ...
警告原因
这个警告的核心是Python对非魔术方法的双下划线开头类方法的命名处理规则变更预警:
- Python中,双下划线开头且非魔术方法(魔术方法指
__init__、__str__这类前后都有双下划线的方法)的名称会被自动做「名称修饰(name mangling)」,比如__call_set会被改成_Cmd__call_set,目的是避免子类重写父类的内部方法。 - 从Python 3.9开始,官方明确将这种「双下划线开头的类方法(非魔术方法)」标记为不推荐写法,会抛出DeprecationWarning,后续版本(如3.10+)会进一步限制这类写法的使用。
解决措施
推荐方案:修改方法名
直接把方法名的双下划线改成单下划线,比如_call_set:
class Cmd(Enum): ... @classmethod def _call_set(cls, ...): ...
单下划线开头是Python社区约定的「内部方法/属性」标识,不会触发名称修饰和警告,完全能替代原代码的语义,同时符合规范。
临时规避方案(不推荐长期使用)
如果暂时无法修改代码,可以在代码入口处添加警告过滤,屏蔽该特定警告:
import warnings # 精准屏蔽该方法的DeprecationWarning warnings.filterwarnings("ignore", category=DeprecationWarning, message=r".*__call_set.*")
但这只是权宜之计,还是建议尽早修改方法名以适配后续Python版本。
内容的提问来源于stack exchange,提问作者Grigory Rechistov
相关产品推荐
相关产品推荐

