В python можно определить функцию, принимающую произвольное количество позиционных аргументов, например:
def f(*args):
print(args)
f(1, 2, 3) # (1, 2, 3)
При вызове f(a, b, c)
все позиционные аргументы объединяются в кортеж .
Это поведение описано в документации на python 2 и 3 , но я не нашел PEP для этого.
PEP 3132 , вводя расширенные итеративные состояния распаковки (first, *middle, last = seqence
) в разделе «Принятие», что
Сделать помеченную цель кортежем вместо списка. Это соответствовало бы * аргументам функции, но усложняло бы дальнейшую обработку результата.
обсуждалось. Если я напишу оболочку, я также могу захотеть обработать аргументы следующим образом:
def force_type(position, type):
def wrapper(f):
def new(*args, **kwargs):
args = list(args) # Why?
args[position] = type(args[position])
return f(*args, **kwargs)
return new
return wrapper
@force_type(1, int)
def func(a, b, c):
assert isinstance(b, int)
Эта дальнейшая обработка усложняется тем фактом, что args
является tuple
. Разве обертки просто не использовались на ранних этапах? Если так, то почему это не изменилось в python3 с другими изменениями, нарушающими совместимость (PEP3132 предпочитает простоту обработки, а не согласованность (которая, по крайней мере, похожа на совместимость в изменении, нарушающем совместимость).
Почему функции *args
(все еще) a tuple
, хотя list
позволяет облегчить дальнейшую обработку?