DeprecationWarning 默认被 Python 忽略,需用 -W default 或 warnings.simplefilter("default") 显式启用;定位问题须用 -W error::DeprecationWarning 触发异常获取 traceback;替换时应查文档并验证行为等价性。

DeprecationWarning 默认被 Python 忽略,所以你很可能根本没看见它——但它真正在提醒你:当前用的 API 很快会失效,不改迟早报 AttributeError 或直接崩溃。
为什么你的终端/IDE 看不到 DeprecationWarning
Python 从 2.7 / 3.2 起,默认过滤掉 DeprecationWarning(只对当前模块开发者显示),普通运行时完全静默。这意味着:
- CI 流程里没开警告检测,就等于埋了雷
-
pytest默认也不显示,得加-W default - PyCharm 可能只标出部分,且不追溯第三方库内部触发的警告
要让它现身,启动时加参数:python -W default your_script.py;或在代码开头插入:
import warnings
warnings.simplefilter("default", DeprecationWarning)
注意:别在生产环境长期开启,仅用于本地诊断和 CI 阶段。
定位具体哪行代码触发了 DeprecationWarning
光看到警告文本不够,得锁定调用栈。最稳的方式是用 -W error 把警告转成异常:
python -W error::DeprecationWarning your_script.py
此时会抛出完整 traceback,比如:
DeprecationWarning: ssl.PROTOCOL_TLS is deprecated
File "requests/adapters.py", line 147, in init_poolmanager
self.poolmanager = PoolManager(... ssl_version=ssl.PROTOCOL_TLS ...)
关键信息是:ssl.PROTOCOL_TLS 已废弃,应换用 ssl.PROTOCOL_TLS_CLIENT 或更推荐的自动协商方式(如 ssl.create_default_context())。不要只搜函数名,要结合上下文判断用途——是客户端通信?服务端监听?还是自定义 SSL 上下文?
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
常见废弃项与安全替换方案
不同库节奏不同,但高频雷区有这些:
-
datetime.utcfromtimestamp()→ 改用datetime.fromtimestamp(ts, tz=timezone.utc)(保留时区语义) -
asyncio.async()(py3.4)→ 直接用asyncio.create_task()(py3.7+)或asyncio.ensure_future()(兼容旧版) -
collections.MutableMapping→ 改为collections.abc.MutableMapping(py3.3+ 引入 abc 子模块) -
pkg_resources.get_distribution()→ 优先用importlib.metadata.version()(py3.8+,stdlib)或importlib_metadata.version()(兼容旧版) -
urllib.parse.urljoin()中 base URL 缺少 scheme 时行为变更 → 确保 base 是完整 URL,如urljoin("https://a.com/", "/b"),而非"a.com"
替换前务必查对应版本文档:比如 requests 2.28+ 废弃 verify=False 的 insecure warning 抑制方式,改用 urllib3.disable_warnings() 显式控制。
自动化扫描 + 持续拦截
人工翻日志太慢。推荐两步走:
- 本地 pre-commit:加
pylint --enable=deprecated或用pygrep扫描硬编码废弃标识符(如ssl\.PROTOCOL_.*TLS) - CI 阶段强制检查:在 GitHub Actions / GitLab CI 的测试步骤中加入
python -W error::DeprecationWarning -m pytest tests/
特别注意:某些警告来自你没直接调用的依赖库(比如 pandas 内部用 np.asscalar()),这时不能硬改,得升依赖版本或向其提 issue。别试图用 warnings.filterwarnings("ignore") 掩盖——那只是把警告藏进黑洞。
真正麻烦的不是改几行代码,而是有些废弃 API 的替代方案行为并不等价(比如时区处理、SSL 协议协商粒度),必须做实际请求验证,而不是只让测试跑过。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










