Просто взгляните на PEP 3102 , и, похоже, это как-то связано с this .
Подводя итог, можно сказать, что патчи и опции принимают переменные аргументы.но позже нужно принять ключевые аргументы.Аргументы ключевого слова передаются в виде словаря, где позиционные аргументы переменной будут заключены в кортежи .
Из вашего примера
def import_(ui, repo, patch1=None, *patches, **opts):
Любые позиционные параметры после u1,repo and patch1
будет обернут как кортежи в патчи.Любые ключевые аргументы, следующие за переменными позиционными аргументами, будут заключены в объекты Dictionary через opts.
Еще одна важная вещь заключается в том, что ответственность за то, чтобы условие non-keyword arg after keyword arg
не нарушалось, лежит на вызывающей стороне.
То есть что-то, что нарушает это, вызывает синтаксическую ошибку ..
Например,
Вызовы типа
import_(1,2,3,test="test")
import_(1,2,3,4,test="test")
import_(1,2,3,4,5)
import_(1,2,patch1=3,test="test")
допустимы, но
import_(1,2,3,patch1=4,5)
вызовет синтаксическую ошибку SyntaxError: non-keyword arg after keyword arg
В первом действительном случае import_(1,2,3,test="test")
u1 = 1, repo = 2, patch1 = 3, patches = () and opts={"test":"test"}
Во втором действительном случае import_(1,2,3,patch1=4,test="test")
u1 = 1, repo = 2, patch1 = 3 , patches = (4) and opts={"test":"test"}
В третьем действительном случае import_(1,2,3,4,5)
u1 = 1, repo = 2, patch1 = 3 , patches=(4,5), and opts={}
В четвертом действительном случае import_(1,2,patch1=3,test="test")
u1 = 1, repo = 2, patch1 = 3 , patches=(), and opts={"test":"test"}
you can use patch1 as a keywords argument but doing so you cannot wrap any variable positional arguments within patches