2011-07-17 8 views
38

Czy ktoś za pomocą czegoś takiego w Pythonie:„or die()” w Pythonie

def die(error_message): 
    raise Exception(error_message) 

... 

check_something() or die('Incorrect data') 

myślę tego rodzaju styl jest używany w PHP i Perl.

Czy znalazłeś jakieś (dis) zalety w tym [stylu]?

+1

co jest nie tak z 'if'? – JBernardo

+8

Wydaje mi się bardziej logiczne, że 'check_something' powinno być funkcją podnoszącą wyjątek, zamiast zwracać True/False. Umożliwiłoby to również uzyskanie bardziej przydatnych komunikatów o błędach, jeśli połączenie z 'check_something' może się nie powieść na wiele sposobów. Weź też pod uwagę, że twoja obecna implementacja 'die' nie pozwala na podniesienie żadnej klasy Exception poza podstawową klasą Exception, co wydaje mi się raczej ograniczone. – Ponkadoodle

+0

Nie używam tego teraz, ale pomysł przyszedł mi, gdy natknąłem się na 'die()' w PHP. Powyższy kod jest tylko przykładem tego, jak można "umrzeć". – warvariuc

Odpowiedz

55

Cóż, po pierwsze, sys.exit([arg]) jest bardziej powszechne, a jeśli naprawdę chciał coś równoważnego do die w PHP, należy użyć, że podniesienie błąd SystemExit lub zadzwoń os._exit.

Głównym zastosowaniem metody die w PHP jest: "Skrypt osiągnął pewien impas, którego nie można odzyskać". Rzadko, jeśli w ogóle, jest używany w kodzie produkcyjnym. Lepiej jest wychowywać wyjątek w wywołanej funkcji, łapać ją w rodzica i znajdować wdzięczny punkt wyjścia - to najlepszy sposób w obu językach.

+2

Chciałbym dać +1 temu dwukrotnie. Deweloper, który widzi "umrzeć" w kodzie źródłowym, może rozsądnie oczekiwać, że próba śmierci nie będzie łatwa do uchwycenia; dlatego jeśli kostka() powinna zostać zaimplementowana, powinna wywołać funkcję os._exit (1). – wberry

+3

No cóż, 'die' można odczytywać w Perlu (choć nie w PHP). –

+7

... Możesz złapać śmierć w Perlu ... To jest niesamowite. (Nie próbuję rozpalić wojny płomieniowej, po prostu myślę, że to zabawne) – cwallenpoole

3

Wygląda na to, że po prostu pakujesz phingo w pythona za pomocą funkcji jednoliniowej. Odradzałbym to, ponieważ możesz pomylić swoją publiczność. Wyjątki to także zupełnie inna bestia niż śmierć w PHP.

6

Największą wadą jest to, że wszystkie umierania są teraz takie same. Lepiej, aby check_something() podniósł dokładniejszy wyjątek, a następnie złap go wyżej, jeśli to konieczne.

14

Podczas gdy ten styl jest powszechny w PHP i Perlu, jest bardzo un-Pythonic i zachęcam do tego, aby nie pisać w ten sposób Python. Należy postępować zgodnie z konwencjami w języku, którego używasz, i napisać coś takiego:

if not check_something(): 
    raise Exception('Incorrect data') 

FWIW, robiąc „or die (...)” sposób dodaje kolejny poziom do śledzenia stosu, który jest kolejna drobna wada.

4

Jeśli masz do czynienia z API, którego nie napisałeś, które zwraca wartości prawdy na temat sukcesu i wartości falsy w przypadku niepowodzenia, wydaje się to rozsądnie czytelnym i kompaktowym sposobem. Jeśli masz kontrolę nad interfejsem API, zachęcam do używania wyjątków zamiast zwracania wartości w celu wskazania błędów.

Jeśli używasz tej funkcji, prawdopodobnie nie powinna ona być wywoływana die(), chyba że faktycznie wychodzi z programu. Jeśli tylko podniesie wyjątek, nie ma gwarancji, że program faktycznie umrze. Idealnie można nazwać ją raise() jako funkcjonalną wersję oświadczenia raise, ale oczywiście nie można, ponieważ raise jest słowem zastrzeżonym. Być może throw().

Dobrym pomysłem byłoby również wymaganie od osoby dzwoniącej, aby przekazała typ wyjątku, ponieważ Exception jest raczej ogólny i niejednoznaczny.

Wydaje mi się, że ta funkcja byłaby zbędna, gdyby tylko wyjątki Python były zdolne do podnoszenia się, to znaczy, że mieli sposobu na to, jak w przykładzie:

class BaseException(object): 
    def throw(self): 
     raise self 

Następnie można po prostu zrobić:

check_something() or Exception("check failed").throw() 

Niestety, wyjątki Python nie mogą się same podnieść.:-)

+0

Wybrałem nazwę "die", aby pokazać, skąd pochodzi pomysł. Myślałem też, że nazywam to 'raise_'. Interesujący pomysł na temat 'Exception.raise()'. – warvariuc

+3

'Niestety, wyjątki Python nie mogą się same podnieść. Wiesz co mówią ... to wymaga wioski. – cwallenpoole

27

Dużo dobrych odpowiedzi, ale nikt jeszcze nie zaproponował oczywisty sposób napisać to w Pythonie:

assert check_something(), "Incorrect data" 

Wystarczy mieć świadomość, że nie zrobi sprawdzanie po włączeniu optymalizacja, a nie to, że ktokolwiek to robi.