yappi icon indicating copy to clipboard operation
yappi copied to clipboard

Yappi 3.12 `AttributeError: _mock_methods` when using MagicMock

Open olejorgenb opened this issue 1 year ago • 3 comments
trafficstars

My program fails when trying to profile using yappi through 3.12 (works fine with cProfile)

olejorgenb avatar May 22 '24 14:05 olejorgenb

I'm seeing this when I use yappi in combination with unittest.mock and Python 3.12. Removing any of those three elements fixes the issue. Here's a repro:

from unittest import mock
import yappi


if __name__ == "__main__":
    yappi.start()
    mock.MagicMock()
    yappi.stop()

Traceback:

Traceback (most recent call last):
  File "/Users/santorella/miniconda3/envs/ax_312_test/lib/python3.12/unittest/mock.py", line 656, in __getattr__
    elif self._mock_methods is not None:
         ^^^^^^^^^^^^^^^^^^
  File "/Users/santorella/miniconda3/envs/ax_312_test/lib/python3.12/unittest/mock.py", line 655, in __getattr__
    raise AttributeError(name)
AttributeError: _mock_methods

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "[...]/test_debug.py", line 15, in <module>
    mock.MagicMock()
  File "/Users/santorella/miniconda3/envs/ax_312_test/lib/python3.12/unittest/mock.py", line 2119, in __init__
    def __init__(self, /, *args, **kw):

SystemError: <sys.legacy_event_handler object at 0x1010a1370> returned a result with an exception set

esantorella avatar May 25 '24 16:05 esantorella

@sumerc I see an AttributeError as well on Python 3.12.

It is easy to reproduce: pip install the ruamel.yaml and yappi libraries, then create a file with this code:

from ruamel.yaml import YAML

print("hi")

Profile on the command line with yappi file.py. It will fail with an AttributeError. However, if you run the file directly, it will work.

Traceback:

Traceback (most recent call last):
  File "/home/mcarans/Code/VirtualEnvs/scratch/lib/python3.12/site-packages/ruamel/yaml/util.py", line 38, in __getattribute__
    lazy_self = object.__getattribute__(self, 'lazy_self')
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'LazyEval' object has no attribute 'lazy_self'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/mcarans/Code/VirtualEnvs/scratch/bin/yappi", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/home/mcarans/Code/VirtualEnvs/scratch/lib/python3.12/site-packages/yappi.py", line 1500, in main
    exec(
  File "yappi_ruamel_fail.py", line 1, in <module>
    from ruamel.yaml import YAML
  File "/home/mcarans/Code/VirtualEnvs/scratch/lib/python3.12/site-packages/ruamel/yaml/__init__.py", line 51, in <module>
    from .cyaml import *  # NOQA
    ^^^^^^^^^^^^^^^^^^^^
  File "/home/mcarans/Code/VirtualEnvs/scratch/lib/python3.12/site-packages/ruamel/yaml/cyaml.py", line 4, in <module>
    from _ruamel_yaml import CParser, CEmitter  # type: ignore
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "_ruamel_yaml.pyx", line 18, in init ruamel.yaml.clib._ruamel_yaml
  File "/home/mcarans/Code/VirtualEnvs/scratch/lib/python3.12/site-packages/ruamel/yaml/reader.py", line 26, in <module>
    from ruamel.yaml.util import RegExp
  File "/home/mcarans/Code/VirtualEnvs/scratch/lib/python3.12/site-packages/ruamel/yaml/util.py", line 49, in <module>
    timestamp_regexp = RegExp(
                       ^^^^^^^
  File "/home/mcarans/Code/VirtualEnvs/scratch/lib/python3.12/site-packages/ruamel/yaml/util.py", line 29, in __init__
    def __init__(self, func: Callable[..., Any], *args: Any, **kwargs: Any) -> None:

SystemError: <sys.legacy_event_handler object at 0x74ff20e77f10> returned a result with an exception set

mcarans avatar Jul 11 '24 23:07 mcarans

I will look into this!

sumerc avatar Jul 19 '24 12:07 sumerc