Как Python различает guish, если параметр является значением по умолчанию? - PullRequest
1 голос
/ 12 марта 2020
a = iter([1])
next(a)
next(a)

повышает StopIteration


a = iter([1])
next(a)
next(a, None)

стоп-изменение отсутствует


однако определение next равно

def next(iterator, default=None):

Как Python различает guish, если параметр задан по умолчанию или задан пользователем?

1 Ответ

2 голосов
/ 12 марта 2020

Встроенная функция 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...