Sometimes I want to reference a class + method in some setup code but really use bound method of an instance. This is quite easy to do with Injector:
import injector
from dataclasses import dataclass
@injector.inject
@injector.singleton
@dataclass
class BoundMethodProvider:
_container: injector.Injector
def __call__(self, meth):
class_name = meth.__qualname__.rsplit('.', 1)[0]
interface = meth.__globals__[class_name]
instance = self._container.get(interface)
method_name = meth.__name__
return getattr(instance, method_name)
container = injector.Injector()
provider = container.get(BoundMethodProvider)
bar = provider(Foo.bar)
Container will get you and instance of an interface with all it’s dependencies provided. Cool.