Skip to content

Module level getattr imports in hume/__init__.py causes infinite recursion with Freezegun when unit testing #442

@clorenz-gi

Description

@clorenz-gi

Basically, freezegun (a utility used to set the datetime for unit testing) does a scan of imports and the module-level getattr to lazily expose symbols causes an infinite recursion:

../venvs/chatbot/lib/python3.12/site-packages/freezegun/api.py:738: in __enter__
    return self.start()
           ^^^^^^^^^^^^
../venvs/chatbot/lib/python3.12/site-packages/freezegun/api.py:827: in start
    module_attrs = _get_cached_module_attributes(module)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../venvs/chatbot/lib/python3.12/site-packages/freezegun/api.py:144: in _get_cached_module_attributes
    _setup_module_cache(module)
../venvs/chatbot/lib/python3.12/site-packages/freezegun/api.py:123: in _setup_module_cache
    all_module_attributes = _get_module_attributes(module)
                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../venvs/chatbot/lib/python3.12/site-packages/freezegun/api.py:112: in _get_module_attributes
    attribute_value = getattr(module, attribute_name)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../venvs/chatbot/lib/python3.12/site-packages/hume/__init__.py:34: in __getattr__
    result = getattr(module, attr_name)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^
../venvs/chatbot/lib/python3.12/site-packages/hume/__init__.py:34: in __getattr__
    result = getattr(module, attr_name)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^
E   RecursionError: maximum recursion depth exceeded
!!! Recursion detected (same locals & position)
def __getattr__(attr_name: str) -> typing.Any:
    module_name = _dynamic_imports.get(attr_name)
    if module_name is None:
        raise AttributeError(f"No {attr_name} found in _dynamic_imports for module name -> {__name__}")
    try:
        module = import_module(module_name, __package__)
        result = getattr(module, attr_name)
        return result
    except ImportError as e:
        raise ImportError(f"Failed to import {attr_name} from {module_name}: {e}") from e
    except AttributeError as e:
        raise AttributeError(f"Failed to get {attr_name} from {module_name}: {e}") from e

To reproduce, just import the hume sdk and attempt to use freezegun in a unit test.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions