From dbf86e4eb40065f6542d2c9e01d7e84f6a1ec544 Mon Sep 17 00:00:00 2001 From: ZipFile Date: Sun, 18 May 2025 12:17:54 +0300 Subject: [PATCH] Do not override methods without patching (#886) --- src/dependency_injector/wiring.py | 4 +++ tests/unit/wiring/test_no_interference.py | 40 +++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 tests/unit/wiring/test_no_interference.py diff --git a/src/dependency_injector/wiring.py b/src/dependency_injector/wiring.py index a67cf76b..1effd16f 100644 --- a/src/dependency_injector/wiring.py +++ b/src/dependency_injector/wiring.py @@ -523,6 +523,10 @@ def _patch_method( _bind_injections(fn, providers_map) + if fn is method: + # Hotfix, see: https://github.com/ets-labs/python-dependency-injector/issues/884 + return + if isinstance(method, (classmethod, staticmethod)): fn = type(method)(fn) diff --git a/tests/unit/wiring/test_no_interference.py b/tests/unit/wiring/test_no_interference.py new file mode 100644 index 00000000..21f8b0e9 --- /dev/null +++ b/tests/unit/wiring/test_no_interference.py @@ -0,0 +1,40 @@ +from typing import Any, Iterator + +from pytest import fixture + +from dependency_injector.containers import DeclarativeContainer +from dependency_injector.providers import Object +from dependency_injector.wiring import Provide, inject + + +class A: + @inject + def foo(self, value: str = Provide["value"]) -> str: + return "A" + value + + +class B(A): ... + + +class C(A): + def foo(self, *args: Any, **kwargs: Any) -> str: + return "C" + super().foo() + + +class D(B, C): ... + + +class Container(DeclarativeContainer): + value = Object("X") + + +@fixture +def container() -> Iterator[Container]: + c = Container() + c.wire(modules=[__name__]) + yield c + c.unwire() + + +def test_preserve_mro(container: Container) -> None: + assert D().foo() == "CAX"