Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

`WarningsRecorder.pop()` returns the last match instead of the first when warning categories are unrelated

Đang mở
#15,097 1 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

@Aditya-XR đang làm issue này rồi.

Từ ngày 24/9/2026.

  • #15098 của @Aditya-XR — đang mở
  • #15105 của @chen-maker999 — đã đóng, không merge
  • #15119 của @Tejas5405 — đang mở

Đánh giá

Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức phù hợp với người mới
35/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
python
Lĩnh vực
testing-qa

Hướng nghiên cứu

Start at the WarningsRecorder.pop implementation and read TestSubclassWarningPop plus test_recording, especially the existing category-selection loop. Add a regression case using unrelated warning categories and verify that pop returns the first matching warning; run the relevant warning-recorder tests.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

WarningsRecorder.pop() (and pytest.warns(...).pop() / recwarn.pop()) returns the last matching warning instead of the first one when the recorded warnings have categories that are unrelated to each other.

import warnings

def test_pop(recwarn):
    warnings.warn("first", UserWarning)
    warnings.warn("second", RuntimeWarning)
    warnings.warn("third", DeprecationWarning)
    assert str(recwarn.pop().message) == "first"
E       AssertionError: assert 'third' == 'first'

The docstring says pop returns "the first recorded warning which is an instance of cls, but not an instance of a child class of any other match". None of the three categories is a subclass of another, so the first one should come back. That was also the behaviour before 8.0.

The cause is the "best inexact match" loop added in #11160 (the fix for #10701):

if issubclass(w.category, cls) and (
    best_idx is None
    or not issubclass(w.category, self._list[best_idx].category)
):
    best_idx = i

not issubclass(new, best) is true both when new is more general than best and when the two are unrelated siblings. So every sibling replaces the current best, and the loop ends up on the last one.

The existing tests in TestSubclassWarningPop only use a single parent/child chain, so they don't catch this. test_recording pops a UserWarning and a DeprecationWarning, but both have the message "hello", so it passes whichever one comes back.

Reproduced on main (pytest 9.2.0.dev345+g872117358), Python 3.13.5, Windows 11. The loop was introduced by #11160, so the bug is present since 8.0.0; in 7.4.x pop() returned the first match. I have a fix with regression tests ready and will open a PR.

Ngôn ngữ chính
Python
Star
14.6k
Fork
3.4k
Merge trung bình
2 ngày 9 giờ
Pull request đã merge (30 ngày)
32

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của pytest-dev/pytest

Tất cả issue của pytest-dev/pytest

Issue tương tự

Thêm issue về Python

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.