2012-04-24 9 views
14

następujące „zasady Samurai”, staram się to zrobić na mojej funkcji, ale wydaje się, że to źle ...oświadczenie podbicie na wyrażenie warunkowe

return <value> if <bool> else raise <exception> 

Czy istnieje jakiś inny „piękny” sposób to zrobić ? Dzięki

+0

Co to jest * Samuraj * tutaj? Co sądzisz o dodaniu szczegółów? – Wolf

+1

Zasada samurajów - Wygrywasz zwycięsko, albo wcale. Jeśli funkcja spełnia swoje obowiązki, zwróć odpowiedni obiekt wyniku, a jeśli nie, wówczas wyrzuć wyjątek. –

+0

Och, rozumiem. Może jakiś związek byłby dobry, taki jak [Zasada Samuraja] (http://c2.com/cgi/wiki?SamuraiPrinciple) – Wolf

Odpowiedz

14

Inline/ternary if jest wyrażeniem, a nie stwierdzeniem. Twoja próba oznacza "jeśli bool, return value, else return the result of raise expression" - co oczywiście jest nonsensem, ponieważ sama nazwa nie jest wyrażeniem.

Nie można tego zrobić w trybie online, a nie powinieneś tego robić. Zrób to jednoznacznie:

if not bool: 
    raise MyException 
return value 
1

Cóż, można przetestować za bool osobno:

if expr: raise exception('foo') 
return val 

ten sposób można przetestować expr wcześniej.

1

Lubię to robić z zapewnieniami, więc podkreślasz, że ten członek musi być, jak kontrakt.

>>> def foo(self): 
...  assert self.value, "Not Found" 
...  return self.value 
+0

W ten sposób nie podnosiłbyś określonego egzekucji, prawda? –

+0

Zauważyłem również, że assert jest, podobnie jak w innych językach, reprodukowany tylko w __debug__, więc jeśli zauważysz błąd w środowisku wykonawczym, czy też będzie to potwierdzać? –

+0

To nie jest bardzo pythonic, i jest to wspomniane wcześniej, jeśli uruchomisz interpreter Pythona bez opcji debiut, asserts są ignorowane ... P.D: -O: optymalizacji wygenerowany kod bajtowy nieznacznie; również PYTHONOPTIMIZE = x –

11

Jeśli koniecznie chcesz raise w wyrażeniu, można zrobić

def raiser(ex): raise ex 

return <value> if <bool> else raiser(<exception>) 

ta „stara”, aby przywrócić wartości zwracanej raiser(), co byłoby None, jeśli nie było bezwarunkowe raise w funkcji.

Powiązane problemy