Подтвердить что ты не робот

"или die()" в Python

Использует ли что-нибудь подобное в Python:

def die(error_message):
    raise Exception(error_message)

...

check_something() or die('Incorrect data')

Я думаю, что этот стиль используется в PHP и Perl.

Вы найдете какие-либо преимущества в этом [стиле]?

4b9b3361

Ответ 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.