mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2024-11-25 19:14:00 +03:00
74 lines
2.5 KiB
ReStructuredText
74 lines
2.5 KiB
ReStructuredText
|
Coroutine providers
|
||
|
-------------------
|
||
|
|
||
|
.. currentmodule:: dependency_injector.providers
|
||
|
|
||
|
:py:class:`Coroutine` provider create wrapped coroutine on every call.
|
||
|
|
||
|
:py:class:`Coroutine` provider is designed for making better integration with
|
||
|
``asyncio`` coroutines. In particular, :py:class:`Coroutine` provider returns
|
||
|
``True`` for ``asyncio.iscoroutinefunction()`` checks.
|
||
|
|
||
|
.. note::
|
||
|
|
||
|
:py:class:`Coroutine` provider works only for Python 3.4+.
|
||
|
|
||
|
Example of usage :py:class:`Coroutine` provider with ``async / await``-based
|
||
|
coroutine:
|
||
|
|
||
|
.. literalinclude:: ../../examples/providers/coroutine_async_await.py
|
||
|
:language: python
|
||
|
:linenos:
|
||
|
|
||
|
Coroutine providers and injections
|
||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
|
||
|
:py:class:`Coroutine` provider takes a various number of positional and keyword
|
||
|
arguments that are used as wrapped coroutine injections. Every time, when
|
||
|
:py:class:`Coroutine` provider is called, positional and keyword argument
|
||
|
injections would be passed as coroutine arguments.
|
||
|
|
||
|
Injections are done according to the next rules:
|
||
|
|
||
|
+ All providers (instances of :py:class:`Provider`) are called every time
|
||
|
when injection needs to be done.
|
||
|
+ Providers could be injected "as is" (delegated), if it is defined obviously.
|
||
|
Check out :ref:`coroutine_providers_delegation`.
|
||
|
+ All other injectable values are provided *"as is"*.
|
||
|
+ Positional context arguments will be appended after :py:class:`Coroutine`
|
||
|
positional injections.
|
||
|
+ Keyword context arguments have priority on :py:class:`Coroutine` keyword
|
||
|
injections and will be merged over them.
|
||
|
|
||
|
.. note::
|
||
|
|
||
|
Examples of making injections could be found in API docs -
|
||
|
:py:class:`Coroutine`.
|
||
|
|
||
|
.. _coroutine_providers_delegation:
|
||
|
|
||
|
Coroutine providers delegation
|
||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
|
||
|
:py:class:`Coroutine` provider could be delegated to any other provider via
|
||
|
any kind of injection.
|
||
|
|
||
|
Delegation of :py:class:`Coroutine` providers is the same as
|
||
|
:py:class:`Factory` providers delegation, please follow
|
||
|
:ref:`factory_providers_delegation` section for examples (with exception
|
||
|
of using :py:class:`DelegatedCoroutine` instead of
|
||
|
:py:class:`DelegatedFactory`).
|
||
|
|
||
|
Abstract coroutine providers
|
||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
|
||
|
:py:class:`AbstractCoroutine` provider is a :py:class:`Coroutine` provider that
|
||
|
must be explicitly overridden before calling.
|
||
|
|
||
|
Behaviour of :py:class:`AbstractCoroutine` providers is the same as of
|
||
|
:py:class:`AbstractFactory`, please follow :ref:`abstract_factory_providers`
|
||
|
section for examples (with exception of using :py:class:`AbstractCoroutine`
|
||
|
provider instead of :py:class:`AbstractFactory`).
|
||
|
|
||
|
.. disqus::
|