Skip to content

AttributeError: __metadata__ on Python 3.13 #303

@kamyarghajar

Description

@kamyarghajar

There is compatibility problem which raises the following exception:

File "venv/lib/python3.13/site-packages/injector/__init__.py", line 1768, in build
    return self._build_class(self._target, **kwargs)
           ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
  File "venv/lib/python3.13/site-packages/injector/__init__.py", line 1763, in _build_class
    return self._injector.create_object(cls, additional_kwargs=kwargs)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "venv/lib/python3.13/site-packages/injector/__init__.py", line 1177, in create_object
    self.call_with_injection(init, self_=instance, kwargs=additional_kwargs)
    ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "venv/lib/python3.13/site-packages/injector/__init__.py", line 1216, in call_with_injection
    bindings = get_bindings(callable)
  File "venv/lib/python3.13/site-packages/injector/__init__.py", line 1358, in get_bindings
    has_injectable_parameters = any(
        _is_specialization(v, Annotated) and _inject_marker in v.__metadata__
        for v in type_hints.values()
    )
  File "venv/lib/python3.13/site-packages/injector/__init__.py", line 1359, in <genexpr>
    _is_specialization(v, Annotated) and _inject_marker in v.__metadata__
                                                           ^^^^^^^^^^^^^^
  File "/opt/homebrew/Cellar/python@3.13/3.13.11/Frameworks/Python.framework/Versions/3.13/lib/python3.13/typing.py", line 1378, in __getattr__
    raise AttributeError(attr)
AttributeError: __metadata__. Did you mean: '__getattr__'?

which might be fixed by replacing:

has_injectable_parameters = any(
    _is_specialization(v, Annotated) and _inject_marker in v.__metadata__
    for v in type_hints.values()
)

in __init__.py file with:

has_injectable_parameters = any(
    _is_specialization(v, Annotated) and _inject_marker in getattr(v, "__metadata__", ())
    for v in type_hints.values()
)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions