Назначение должно быть проанализировано как
(start, stop) = (0, start)
То есть interval(10)
эквивалентно interval(0, 10)
. Хотя первый параметр name равен start
, это действительно значение stop
, если указан только один аргумент.
while
l oop эквивалентно более прямолинейный for
l oop
for i in range(start, stop + 1, step):
result.append(i)
, за исключением interval
позволяет start
, stop
и step
все имеют типы, отличные от int
.
Лучшим дизайном может быть требование использования аргументов только для ключевых слов, чтобы в теле функции не было неоднозначности в том, как используется каждый параметр:
def interval(*, start=0, stop, step=1):
result = []
while start < stop:
result.append(start)
start += step
return result
Теперь вы можете вызывать interval(stop=10)
или interval(start=3, stop=10)
; В любом случае, параметр start
фактически является начальным значением в обоих случаях. Однако это компромисс в том, что вы больше не можете писать interval(10)
для того, что можно ожидать в качестве наиболее распространенного варианта использования.