kwargs
в **kwargs
- просто имя переменной. Вы можете очень хорошо иметь **anyVariableName
kwargs
означает «аргументы ключевого слова». Но я считаю, что их лучше назвать «именованными аргументами», поскольку это просто аргументы, передаваемые вместе с именами (я не считаю какое-либо значение для слова «ключевое слово» в терминах «аргументы ключевых слов». Я думаю, что «ключевое слово» обычно означает слова, зарезервированные по языку программирования и, следовательно, не используемые программистом для имен переменных. В этой ситуации здесь не происходит.). Поэтому мы даем именам param1
и param2
двум значениям параметров, переданным функции следующим образом: func(param1="val1",param2="val2")
вместо передачи только значений: func(val1,val2)
. Таким образом, я считаю, что их следует соответствующим образом называть «произвольным числом именованных аргументов», поскольку мы можем указать любое количество этих параметров (то есть аргументы), если func
имеет подпись func(**kwargs)
Так что, говоря, что позвольте мне сначала объяснить «именованные аргументы», а затем «произвольное число именованных аргументов» kwargs
.
Именованные аргументы
def function1(param1,param2="arg2",param3="arg3"):
print("\n"+str(param1)+" "+str(param2)+" "+str(param3)+"\n")
function1(1) #1 arg2 arg3 #1 positional arg
function1(param1=1) #1 arg2 arg3 #1 named arg
function1(1,param2=2) #1 2 arg3 #1 positional arg, 1 named arg
function1(param1=1,param2=2) #1 2 arg3 #2 named args
function1(param2=2, param1=1) #1 2 arg3 #2 named args out of order
function1(1, param3=3, param2=2) #1 2 3 #
#function1() #invalid: required argument missing
#function1(param2=2,1) #invalid: SyntaxError: non-keyword arg after keyword arg
#function1(1,param1=11) #invalid: TypeError: function1() got multiple values for argument 'param1'
#function1(param4=4) #invalid: TypeError: function1() got an unexpected keyword argument 'param4'
Произвольное число именованных аргументов kwargs
def function2(param1, *tupleParams, param2, param3, **dictionaryParams):
print("param1: "+ param1)
print("param2: "+ param2)
print("param3: "+ param3)
print("custom tuple params","-"*10)
for p in tupleParams:
print(str(p) + ",")
print("custom named params","-"*10)
for k,v in dictionaryParams.items():
print(str(k)+":"+str(v))
function2("arg1",
"custom param1",
"custom param2",
"custom param3",
param3="arg3",
param2="arg2",
customNamedParam1 = "val1",
customNamedParam2 = "val2"
)
# Output
#
#param1: arg1
#param2: arg2
#param3: arg3
#custom tuple params ----------
#custom param1,
#custom param2,
#custom param3,
#custom named params ----------
#customNamedParam2:val2
#customNamedParam1:val1
Передача кортежей и переменных dict для пользовательских аргументов
Чтобы закончить его, позвольте мне также отметить, что мы можем пройти
Таким образом, тот же самый вызов можно сделать следующим образом:
tupleCustomArgs = ("custom param1", "custom param2", "custom param3")
dictCustomNamedArgs = {"customNamedParam1":"val1", "customNamedParam2":"val2"}
function2("arg1",
*tupleCustomArgs, #note *
param3="arg3",
param2="arg2",
**dictCustomNamedArgs #note **
)
Наконец, обратите внимание на *
и **
в вызовах функций выше. Если мы их опустим, мы можем получить больные результаты.
Опускание *
в кортежах args:
function2("arg1",
tupleCustomArgs, #omitting *
param3="arg3",
param2="arg2",
**dictCustomNamedArgs
)
печатает
param1: arg1
param2: arg2
param3: arg3
custom tuple params ----------
('custom param1', 'custom param2', 'custom param3'),
custom named params ----------
customNamedParam2:val2
customNamedParam1:val1
Выше кортежа ('custom param1', 'custom param2', 'custom param3')
печатается как есть.
Опускание dict
args:
function2("arg1",
*tupleCustomArgs,
param3="arg3",
param2="arg2",
dictCustomNamedArgs #omitting **
)
дает
dictCustomNamedArgs
^
SyntaxError: non-keyword arg after keyword arg
решаемые.
Проблема была в коде компонентов - я забыл удалить все ссылки на предыдущий экземпляр контроллера, и после изменения состояния этот контроллер остался живым в памяти (я не уверен, как он был подключен к новому объекту области, но он описывает решение).
Если у вас такое поведение, попробуйте оставить практически пустой компонент, и вы обнаружите ошибку.