You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 04:40:35