Frequently Asked Questions¶
If I use inject()
or scope decorators on my classess will I be able to create instances of them without using Injector?¶
Yes. Scope decorators don’t change the way you can construct your class instances without Injector interaction.
I’m calling this method (/function/class) but I’m getting “TypeError: XXX() takes exactly X arguments (Y given)”¶
Example code:
class X:
@inject
def __init__(self, s: str):
self.s = s
def configure(binder):
binder.bind(s, to='some string')
injector = Injector(configure)
x = X()
Result?
TypeError: __init__() takes exactly 2 arguments (1 given)
Reason? There’s no global state that Injector
modifies when
it’s instantiated and configured. Its whole knowledge about bindings etc.
is stored in itself. Moreover inject()
will not make
dependencies appear out of thin air when you for example attempt to create
an instance of a class manually (without Injector
’s help) - there’s no
global state @inject
decorated methods can access.
In order for X
to be able to use bindings defined in @inject
decoration Injector
needs to be used (directly or indirectly)
to create an instance of X
. This means most of the time you want to just
inject X
where you need it, you can also use Injector.get()
to obtain
an instance of the class (see its documentation for usage notes).