diff --git a/docs/images/providers/factory_init_injections.png b/docs/images/providers/factory_init_injections.png deleted file mode 100644 index f39b44d7..00000000 Binary files a/docs/images/providers/factory_init_injections.png and /dev/null differ diff --git a/docs/providers/factory.rst b/docs/providers/factory.rst index d972cf83..28015e1d 100644 --- a/docs/providers/factory.rst +++ b/docs/providers/factory.rst @@ -24,18 +24,11 @@ injected following these rules: + Keyword context arguments have the priority over the ``Factory`` keyword dependencies with the same name. -For example, if injectable value of injection is a :py:class:`Factory`, it -will provide new one instance (as a result of its call) every time, when -injection needs to be done. - -Example below is a little bit more complicated. It shows how to create -:py:class:`Factory` of particular class with ``__init__()`` injections which -injectable values are also provided by another factories: - -.. image:: /images/providers/factory_init_injections.png +.. image:: images/factory_init_injections.png .. literalinclude:: ../../examples/providers/factory_init_injections.py :language: python + :lines: 3- Factory providers and building complex object graphs ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/providers/images/factory_init_injections.png b/docs/providers/images/factory_init_injections.png new file mode 100644 index 00000000..389bdd28 Binary files /dev/null and b/docs/providers/images/factory_init_injections.png differ diff --git a/examples/providers/factory_init_injections.py b/examples/providers/factory_init_injections.py index 2bdb0b24..ed37fd09 100644 --- a/examples/providers/factory_init_injections.py +++ b/examples/providers/factory_init_injections.py @@ -1,39 +1,37 @@ """`Factory` providers init injections example.""" -import collections - -import dependency_injector.providers as providers +from dependency_injector import providers -CreditCard = collections.namedtuple('CreditCard', []) -Photo = collections.namedtuple('Photo', []) -User = collections.namedtuple('User', ['uid', 'main_photo', 'credit_card']) - -# User, Photo and CreditCard factories: -credit_cards_factory = providers.Factory(CreditCard) -photos_factory = providers.Factory(Photo) -users_factory = providers.Factory(User, - main_photo=photos_factory, - credit_card=credit_cards_factory) - -# Creating several User objects: -user1 = users_factory(1) -# Same as: user1 = User(1, -# main_photo=Photo(), -# credit_card=CreditCard()) -user2 = users_factory(2) -# Same as: user2 = User(2, -# main_photo=Photo(), -# credit_card=CreditCard()) +class Photo: + ... -# Context keyword arguments have priority on keyword argument injections: -main_photo = Photo() -credit_card = CreditCard() +class User: -user3 = users_factory(3, - main_photo=main_photo, - credit_card=credit_card) -# Same as: user3 = User(3, -# main_photo=main_photo, -# credit_card=credit_card) + def __init__(self, uid: int, main_photo: Photo): + self.uid = uid + self.main_photo = main_photo + + +photo_factory = providers.Factory(Photo) +user_factory = providers.Factory( + User, + main_photo=photo_factory, +) + + +if __name__ == '__main__': + user1 = user_factory(1) + # Same as: # user1 = User(1, main_photo=Photo()) + + user2 = user_factory(2) + # Same as: # user2 = User(2, main_photo=Photo()) + + # Context keyword arguments have a priority: + another_photo = Photo() + user3 = user_factory( + uid=3, + main_photo=another_photo, + ) + # Same as: # user3 = User(uid=3, main_photo=another_photo)