"или die()" в Python
Использует ли что-нибудь подобное в Python:
def die(error_message):
raise Exception(error_message)
...
check_something() or die('Incorrect data')
Я думаю, что этот стиль используется в PHP и Perl.
Вы найдете какие-либо преимущества в этом [стиле]?
Ответы
Ответ 1
Ну, во-первых, sys.exit([arg])
является более распространенным явлением, и если вы действительно хотели что-то эквивалентное die
в PHP, вы должны использовать что, повысьте ошибку SystemExit или вызовите os._exit.
Основное использование метода die
в PHP: "script достиг некоторого тупика, который не может оправиться от него". Это редко, если вообще когда-либо используется на производственном коде. Вам лучше создавать исключение в вызываемой функции, улавливать ее в родительском элементе и находить изящную точку выхода - это лучший способ на обоих языках.
Ответ 2
Много хороших ответов, но никто еще не предложил очевидный способ написать это в Python:
assert check_something(), "Incorrect data"
Просто имейте в виду, что он не будет делать проверку, если вы включите оптимизацию, а не то, что когда-либо делали.
Ответ 3
Хотя этот стиль распространен в PHP и Perl, он очень не-Pythonic, и я бы посоветовал вам не писать Python таким образом. Вы должны следовать соглашениям на используемом вами языке и писать что-то вроде этого:
if not check_something():
raise Exception('Incorrect data')
FWIW, использование пути "или die (...)" добавляет еще один уровень к вашей трассировке стека, что является еще одним незначительным недостатком.
Ответ 4
Самым большим недостатком является то, что все умирающие теперь одно и то же. Лучше иметь check_something()
повысить более точное исключение, а затем уловить выше, если это необходимо.
Ответ 5
Если вы имеете дело с API, который вы не пишете, который возвращает правдивые значения при успешном и ложном значениях при сбое, это похоже на разумно читаемый и компактный способ сделать это. Если у вас есть контроль над API, я бы рекомендовал использовать исключения вместо возвращаемых значений для указания ошибок.
Если вы используете эту функцию, ее, вероятно, не следует называть die()
, если она фактически не выйдет из программы. Если это просто вызывает исключение, нет гарантии, что программа действительно умрет. В идеале вы можете назвать его raise()
как функциональную версию оператора raise
, но, конечно же, вы не можете, потому что raise
является зарезервированным словом. Возможно, throw()
.
Также было бы неплохо потребовать, чтобы вызывающий передал тип исключения, так как Exception
довольно общий и неопределенный.
Мне кажется, что эта функция не нужна, если бы только исключения на Python могли повышаться, т.е. у них был метод для нее:
class BaseException(object):
def throw(self):
raise self
Тогда вы можете просто сделать:
check_something() or Exception("check failed").throw()
К сожалению, исключения Python не могут поднять себя.: -)
Ответ 6
Кажется, вы просто обертываете php lingo в python с помощью одной линии. Я бы посоветовал это, так как вы могли бы смутить вашу аудиторию. Исключения также являются совершенно другим зверем, чем умирают в PHP.