python / python/cpython

`logging.captureWarnings` and `warnings.catch_warnings` do not play well together

未关闭
#139,355 2 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

stdlib type-bug
主要语言
Python
星标
77.2k
派生
35.9k
PR 合并指标
PR 指标待抓取

描述

Bug report

Bug description:

When logging.captureWarnings(True) is called within a warnings.catch_warnings(record=True) context warnings emitted during the context are not recorded.

import logging, warnings
with warnings.catch_warnings(record=True) as rec:
    logging.captureWarnings(True)
    warnings.warn("foo")
assert len(rec) == 1  # fails since len(rec) == 0

one work-around for this is to enable captureWarnings outside the context

import logging, warnings
logging.captureWarnings(True)
with warnings.catch_warnings(record=True) as rec:
    warnings.warn("foo")
assert len(rec) == 1

I tested the above examples on 3.10, 3.13 and 3.14.0b2.

However on 3.14.0b2 with PYTHON_CONTEXT_AWARE_WARNINGS=1 (to pull in the changes from https://github.com/python/cpython/pull/130010) the second example (enabling captureWarnings outside the catch_warnings) no longer works.

CPython versions tested on:

3.13

Operating systems tested on:

macOS

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

首先使用 logging.captureWarnings(True) 和 warnings.catch_warnings(record=True) 重现这些示例,包括 PYTHON_CONTEXT_AWARE_WARNINGS=1。跟踪这两个 API 之间的交互,并验证在上下文中发出的警告是否会在报告所述的两种配置中都被记录。

由索引模型根据 Issue 内容生成。

评估

技术栈
python
领域
backend
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
45/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。