python / python/cpython

mock.seal has infinite recursion with mutually recursive class references

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

Chưa có ai nhận issue này.

stdlib type-bug
Ngôn ngữ chính
Python
Star
77.2k
Fork
36k
Chỉ số merge pull request
Chỉ số pull request đang chờ

Mô tả

Bug report

This code seems to cause infinite recursion in unittest.mock.seal:

from unittest import mock
class Foo:
  pass
class Bar:
  foo = Foo
Foo.bar = Bar
foo = mock.create_autospec(Foo)
mock.seal(foo)
$ python3 foo.py 
Traceback (most recent call last):
  File "/tmp/tmp.yKOznvlUIG/foo.py", line 8, in <module>
    mock.seal(foo)
  File "/usr/lib/python3.9/unittest/mock.py", line 2874, in seal
    seal(m)
  File "/usr/lib/python3.9/unittest/mock.py", line 2874, in seal
    seal(m)
  File "/usr/lib/python3.9/unittest/mock.py", line 2874, in seal
    seal(m)
  [Previous line repeated 973 more times]
  File "/usr/lib/python3.9/unittest/mock.py", line 2866, in seal
    m = getattr(mock, attr)
  File "/usr/lib/python3.9/unittest/mock.py", line 655, in __getattr__
    result = create_autospec(
  File "/usr/lib/python3.9/unittest/mock.py", line 2627, in create_autospec
    mock = Klass(parent=_parent, _new_parent=_parent, _new_name=_new_name,
  File "/usr/lib/python3.9/unittest/mock.py", line 2034, in __init__
    _safe_super(MagicMixin, self).__init__(*args, **kw)
  File "/usr/lib/python3.9/unittest/mock.py", line 1074, in __init__
    _safe_super(CallableMixin, self).__init__(
  File "/usr/lib/python3.9/unittest/mock.py", line 437, in __init__
    self._mock_add_spec(spec, spec_set, _spec_as_instance, _eat_self)
  File "/usr/lib/python3.9/unittest/mock.py", line 500, in _mock_add_spec
    res = _get_signature_object(spec,
  File "/usr/lib/python3.9/unittest/mock.py", line 107, in _get_signature_object
    return func, inspect.signature(sig_func)
  File "/usr/lib/python3.9/inspect.py", line 3113, in signature
    return Signature.from_callable(obj, follow_wrapped=follow_wrapped)
  File "/usr/lib/python3.9/inspect.py", line 2862, in from_callable
    return _signature_from_callable(obj, sigcls=cls,
  File "/usr/lib/python3.9/inspect.py", line 2333, in _signature_from_callable
    wrapped_sig = _get_signature_of(obj.func)
  File "/usr/lib/python3.9/inspect.py", line 2329, in _signature_from_callable
    return _signature_from_builtin(sigcls, obj,
  File "/usr/lib/python3.9/inspect.py", line 2149, in _signature_from_builtin
    return _signature_fromstr(cls, func, s, skip_bound_arg)
  File "/usr/lib/python3.9/inspect.py", line 2009, in _signature_fromstr
    _signature_strip_non_python_syntax(s)
  File "/usr/lib/python3.9/inspect.py", line 1962, in _signature_strip_non_python_syntax
    for t in token_stream:
  File "/usr/lib/python3.9/tokenize.py", line 525, in _tokenize
    pseudomatch = _compile(PseudoToken).match(line, pos)
  File "/usr/lib/python3.9/tokenize.py", line 99, in _compile
    return re.compile(expr, re.UNICODE)
  File "/usr/lib/python3.9/re.py", line 252, in compile
    return _compile(pattern, flags)
  File "/usr/lib/python3.9/re.py", line 292, in _compile
    flags = flags.value
  File "/usr/lib/python3.9/types.py", line 178, in __get__
    return self.fget(instance)
RecursionError: maximum recursion depth exceeded

Your environment

  • CPython versions tested on: 3.9.9
  • Operating system and architecture: Debian testing, amd64

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

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.

Hướng nghiên cứu

Bắt đầu với unittest.mock.seal và create_autospec trong unittest/mock.py, sử dụng trình tái hiện Foo/Bar được cung cấp để lần theo đường đệ quy. Công việc được hoàn tất khi các tham chiếu lớp đệ quy lẫn nhau không còn gây ra đệ quy vô hạn hoặc RecursionError khi mock.seal(foo) chạy.

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ó
3/5
Thời gian dự kiến
1-2 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
38/100

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.