Следует прямо указать, что args
- это специальное слово в Tcl, которое при использовании в конце списка аргументов содержит список всех оставшихся аргументов. Если args
не указано, ошибка не выдается (в отличие от любого другого имени переменной, которое считается обязательным аргументом).
Я искал способ получить функциональность, аналогичную kwargs
(необязательные аргументы пары ключ-значение) в python, и что-то, что хорошо работает (аналогично последнему примеру Гленна):
proc my_proc {positional_required1 {positional_optional1 "a_string"} args} {
# Two optional arguments can be given: "opt1" and "opt2"
if {![string equal $args ""]} {
# If one or more args is given, parse them or assign defaults.
array set opts $args
if {[info exists opts(opt1)]} { set opt1 $opts(opt1) } else { set opt1 0 }
if {[info exists opts(op2)]} { set opt2 $opts(opt2) } else { set opt2 -1 }
} else {
# If no args are given, assign default values.
set op1 0
set op2 -1
}
# DO STUFF HERE
}
И можно назвать как:
my_proc "positional_required1_argument"
# OR
my_proc "positional_required1_argument" "a_string"
# OR
my_proc "positional_required1_argument" "a_string" opt1 7
# OR
my_proc "positional_required1_argument" "a_string" opt1 7 opt2 50
# etc.
Потенциальным недостатком (как я сейчас это реализовал) является то, что если пользователь пропустит неподтвержденную опцию ключ-значение, ошибки не будет.