Позиционный аргумент после звездочки в Python

У меня есть модель в Джанго. Project Он имеет внешний ключ к модели Organization с related_name='projects' . Поэтому я могу вызвать my_org.projects.all() . Но что, если я хотел бы вызвать my_org.projects() ? Давайте проверим:

(Pdb++) org = Organization.objects.first()
(Pdb++) org.projects()
*** TypeError: __call__() missing 1 required keyword-only argument: 'manager'
(Pdb++) org.projects(None)
*** TypeError: __call__() takes 1 positional argument but 2 were given

Это действительно необычно. Так что же вызывает это? Вот код, расположенный в RelatedManager в Django:

        def __call__(self, *, manager):
            manager = getattr(self.model, manager)
            manager_class = create_reverse_many_to_one_manager(manager.__class__, rel)
            return manager_class(self.instance)

Может кто-нибудь объяснить мне, как устроен этот метод? Насколько я знаю, вы не можете поместить позиционный аргумент после звездочки *args . Но здесь мы имеем (self, *, manager) . Похоже, программист никогда не сможет пройти мимо manager !

Всего 1 ответ


Как прокомментировали @Abdul Niyas PM и @N Chauhan, это хитрый способ заставить эту функцию вызывать аргументы с ключевыми словами. Каждый позиционный аргумент будет использоваться звездочкой, поэтому единственный способ передать manager - использовать ключевое слово-аргумент, и он будет выглядеть как org.projects(manager=None) . Это также хорошо объяснено здесь .


Есть идеи?

10000