Использование TortoiseSVN, если вы хотите просто увидеть репозиторий в версии до совершения нарушения:
Как насчет поднять ArgumentError
? Затем вы можете попробовать
вызвать его и обработать исключение, если аргумент неверен.
Примерно так:
try:
v1, v2, v3 = MyFunc()
except ArgumentError:
#deal with it
Также см. ответ katrielalex для использования подкласса ArgumentError.
Это должно работать нормально:
v1, v2, v3 = MyFunc() or (None, None, None)
Когда MyFunc ()
возвращает кортеж, он будет распакован, в противном случае он будет заменен на 3-кортеж None
.
Другое решение: я мог бы заставить функцию возвращать кортеж, полный Nones, чтобы вызывающая сторона могла легко распаковать ....
Что в этом плохого? Последовательность - это хорошо.
Если вы хотите, чтобы объекты 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
. Он каким-то образом стоит между первыми двумя случаями, потому что отказ сопоставления является ожидаемым результатом, а возвращаемый объект по умолчанию в любом случае не будет очень полезен.
recursive
имеет действительно элегантное и питоническое решение. НО: почему вы хотите вернуть None
? В Python есть способ обработки ошибок, который заключается в создании исключения:
class AIsTooSmallError( ArgumentError ): pass
и затем
raise AIsTooSmallError( "a must be positive." )
Причина, по которой это лучше, заключается в том, что возвращение значения означает, что вы завершили обработку и передаете ответ. Это хорошо, если вы выполнили некоторую обработку, но это глупо, если вы сразу возвращаете None
.