Встроенная функция next
не использует None
по умолчанию. Фактически, как вы можете видеть в исходном коде C (для cpython, официального интерпретатора Python), его обработка аргументов очень низкого уровня . Чистый эквивалент Python будет использовать *args
в определении функции и вручную проверять, что вы получили один или два аргумента. Вот как это может выглядеть:
def next(*args):
assert(1 <= len(args) <= 2)
try:
return args[0].__next__()
except StopIteration:
if len(args) > 1:
return args[1]
else:
raise
Лучший способ воспроизвести подобное поведение в Python - это использовать значение по умолчанию, которое не может быть случайно предоставлено внешним кодом. Вот один хороший способ сделать это:
_sentinel = object() # a unique object that no user should ever pass to us
def next(iterator, default=_sentinel):
try:
return iterator.__next__()
except StopIteration:
if default is not _sentinel:
return default
else:
raise