Функция, возвращающая кортеж или None: как правильно вызвать эту функцию?

Использование TortoiseSVN, если вы хотите просто увидеть репозиторий в версии до совершения нарушения:

  • Откройте URL-адрес с помощью браузера репозитория TortoiseSVN.
  • Обратите внимание: номер ревизии этого фиксажа и изменить HEAD на это число - 1, нажав кнопку в верхней правой части.

13
задан Elias Bachaalany 10 August 2010 в 12:06
поделиться

5 ответов

Как насчет поднять ArgumentError ? Затем вы можете попробовать вызвать его и обработать исключение, если аргумент неверен.

Примерно так:

try:
    v1, v2, v3 = MyFunc()
except ArgumentError:
    #deal with it

Также см. ответ katrielalex для использования подкласса ArgumentError.

12
ответ дан 1 December 2019 в 19:22
поделиться

Это должно работать нормально:

v1, v2, v3 = MyFunc() or (None, None, None)

Когда MyFunc () возвращает кортеж, он будет распакован, в противном случае он будет заменен на 3-кортеж None .

10
ответ дан 1 December 2019 в 19:22
поделиться

Другое решение: я мог бы заставить функцию возвращать кортеж, полный Nones, чтобы вызывающая сторона могла легко распаковать ....

Что в этом плохого? Последовательность - это хорошо.

4
ответ дан 1 December 2019 в 19:22
поделиться

Если вы хотите, чтобы объекты v1, v2, v3 существовали и для них было установлено значение по умолчанию в случае ошибки, верните значения по умолчанию самостоятельно. Это упростит вызывающий код, не полагаясь на то, что вызывающий объект устанавливает их вручную:

def MyFunc(a):
    if a < 0:
        # can't use a negative value; just return some defaults
        return (None, None, None)
    return (a+1, a+2, a+3)

С другой стороны, если возврат по умолчанию не подходит и отрицательный аргумент считается серьезной ошибкой, вызовите исключение:

def MyFunc(a):
    if a < 0:
        # sorry, negative values are unacceptable
        raise ValueError('cannot accept a negative value')
    return (a+1, a+2, a+3)

На третьем третьем возврате None иногда может быть предпочтительнее при возврате одного объекта, как в случае с search () и match ( ) функции модуля re . Он каким-то образом стоит между первыми двумя случаями, потому что отказ сопоставления является ожидаемым результатом, а возвращаемый объект по умолчанию в любом случае не будет очень полезен.

1
ответ дан 1 December 2019 в 19:22
поделиться

recursive имеет действительно элегантное и питоническое решение. НО: почему вы хотите вернуть None? В Python есть способ обработки ошибок, который заключается в создании исключения:

class AIsTooSmallError( ArgumentError ): pass

и затем

raise AIsTooSmallError( "a must be positive." )

Причина, по которой это лучше, заключается в том, что возвращение значения означает, что вы завершили обработку и передаете ответ. Это хорошо, если вы выполнили некоторую обработку, но это глупо, если вы сразу возвращаете None.

8
ответ дан 1 December 2019 в 19:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: