mock.mock_open __exit__ called as instance method from contextlib.ExitStack context
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Python
- Star
- 77.2k
- Fork
- 35.9k
- Chỉ số merge pull request
- Chỉ số pull request đang chờ
Mô tả
Bug report
Bug description:
In Python 3.13 onwards:
from contextlib import ExitStack
from unittest import mock
with mock.patch("__main__.open", mock.mock_open()) as m:
with ExitStack() as exit_stack:
with exit_stack.enter_context(open("/tmp/test.txt", "w")):
pass
raises
TypeError: mock_open.<locals>._exit_side_effect() takes 3 positional arguments but 4 were given
The issue seems to come from https://github.com/python/cpython/commit/3f7c0810f6158a7ff37be432f8d7f9511427489f
It appears that in Python versions 3.12 and earlier, mock_open().__exit__ was always called with 4 args (self, exctype, excinst, exctb) when used with contextlib.ExitStack but that used to be a no-op before the exit handler was added.
I'm not sure whether this should be fixed by:
- changing the way
ExitStackcalls its stack of__exit__callbacks - making
mock_openandopenmore similar, or - making
mock_open's exit handler take*args, **kwargssame as the enter handler??
Thanks
CPython versions tested on:
3.12, 3.13, 3.14
Operating systems tested on:
Linux
Linked PRs
- gh-150521
- gh-150535
- gh-151829
- gh-151861
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- 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.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu với reproducer bằng cách sử dụng contextlib.ExitStack và unittest.mock.mock_open, sau đó kiểm tra hành vi của callback được mô tả trong issue. Công việc được hoàn thành khi TypeError trong Python 3.13+ được giải quyết, vẫn giữ nguyên hành vi context manager như mong đợi và bổ sung coverage cho trường hợp được báo cáo.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- python
- Lĩnh vực
- testing
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 25/100