mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2024-11-25 11:04:01 +03:00
69 lines
1.7 KiB
ReStructuredText
69 lines
1.7 KiB
ReStructuredText
Chained Factories pattern
|
|
=========================
|
|
|
|
This example demonstrates "Chained Factories" pattern.
|
|
|
|
The idea of the pattern is in wrapping ``Factory`` into another ``Factory`` that adds
|
|
additional arguments.
|
|
|
|
.. code-block:: python
|
|
|
|
base_factory = providers.Factory(
|
|
SomeClass,
|
|
base_argument=1,
|
|
)
|
|
|
|
concrete_factory = providers.Factory(
|
|
base_factory,
|
|
extra_argument=2,
|
|
)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
instance = concrete_factory()
|
|
# Same as: # instance = SomeClass(base_argument=1, extra_argument=2)
|
|
|
|
Sample code
|
|
-----------
|
|
|
|
Listing of the pattern example:
|
|
|
|
.. literalinclude:: ../../examples/miniapps/factory-patterns/chained_factories.py
|
|
:language: python
|
|
|
|
Arguments priority
|
|
------------------
|
|
|
|
Passing of the arguments works the same way like for any other :ref:`factory-provider`.
|
|
|
|
.. code-block:: python
|
|
|
|
# 1. Keyword arguments of upper level factory are added to lower level factory
|
|
chained_dict_factory = providers.Factory(
|
|
providers.Factory(dict, arg1=1),
|
|
arg2=2,
|
|
)
|
|
print(chained_dict_factory()) # prints: {'arg1': 1, 'arg2': 2}
|
|
|
|
# 2. Keyword arguments of upper level factory have priority
|
|
chained_dict_factory = providers.Factory(
|
|
providers.Factory(dict, arg1=1),
|
|
arg1=2,
|
|
)
|
|
print(chained_dict_factory()) # prints: {'arg1': 2}
|
|
|
|
# 3. Keyword arguments provided from context have the most priority
|
|
chained_dict_factory = providers.Factory(
|
|
providers.Factory(dict, arg1=1),
|
|
arg1=2,
|
|
)
|
|
print(chained_dict_factory(arg1=3)) # prints: {'arg1': 3}
|
|
|
|
|
|
Credits
|
|
-------
|
|
|
|
The "Chained Factories" pattern was suggested by the ``Dependency Injector`` users.
|
|
|
|
.. disqus::
|