Возвратите утверждения в функциях проверки - PullRequest
0 голосов
/ 12 октября 2019

Я просматривал https://github.com/python/cpython/blob/master/Lib/datetime.py и наткнулся на некоторые функции проверки типов (я упростил их, оригинал _check_int_field)

def foo(year, month, day):
    year = check_int(year)
    month = check_int(month)
    day = check_int(day)

check_int возвращает введенное значение (если это целое число) -и вызывает ValueError, если это не так. Позвольте мне сократить функцию, которую они использовали:

def check_int(value):
    if isinstance(value, int):
        return value
    if not isinstance(value, int):
        raise TypeError('integer argument expected, got %s' % type(value))

Мой вопрос: в чем смысл выражения return? Конечно, вы могли бы просто реализовать его как

def check_int(value):
    if not isinstance(value, int):
        raise TypeError('integer argument expected, got %s' % value)

Это изменит функцию foo на (где вам не нужно будет определять переменные, а просто использовать аргументы foo)

def foo(year, month, day):
    check_int(year)
    check_int(month)
    check_int(day)

Это вызовет TypeError, если тип ввода неверен - и просто продолжит работу с аргументами функции, если нет, без необходимости определения каких-либо переменных. Так почему же они возвращают входную переменную, если не изменяют ее, а просто проверяют?

1 Ответ

1 голос
/ 12 октября 2019

В целом я согласен с тем, что чистые функции проверки также могут быть void, т. Е. Ничего не возвращать и, при необходимости, вызывать исключение.

Однако в данном конкретном случае функция _check_int_field фактически используется следующим образом:это:

year = _check_int_field(year)

И это имеет смысл, потому что в _check_int_field они делают это:

try:
    value = value.__int__()
except AttributeError:
    pass
else:
    if not isinstance(value, int):
        raise TypeError('__int__ returned non-int (type %s)' %
                        type(value).__name__)
    return value

Таким образом, функция на самом деле делает больше, чем просто проверка. В этом случае имеет смысл возвращать значение функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...