Zagnieżdżony else

0

Hej, zastanawiam się czy jest jakaś alternatywa dla else zachodzącego zawsze gdy nie zostanie spełniony żaden z zagnieżdżonych ifów w if/elif/else statement.

Przykładowo, chciałbym uzyskać taki efekt:

if warunek1:
  if warunek2:
    if warunek21:
      pass
    else:
      var1 = abc
  elif warunek3:
    pass
  else:
    var1 = abc
  pass
else:
  var1 = abc

Tyle że z użyciem jednego else ogólnego, czy jest możliwe zrobienie tego nie tworząc dodatkowej zmiennej pomocniczej?
Przykładowo aby to wyglądało jakoś podobnie do:

if warunek1:
  if warunek2:
    if warunek21:
      pass
  elif warunek3:
    pass
  pass
else_absolutne:
  var1 = abc

Jeśli ktoś coś słyszał, albo jest pewien że taka redukcja podobnych bloków jest niemożliwa, też będę wdzięczny za odpowiedź :). Osobiście przyznam, że na takie pytanie raczej bym rzekł że jest to niemożliwe, niemniej...
Może jeszcze czymś python mnie zadziwi ^^.

Precyzując chodzi o sytuację kiedy struktura if/elif jest nieprawidłowa w zagnieżdżeniu, to odwołuje się do 'else_absolutne' i wychodzi z zagnieżdżenia na normalnych zasadach.

0

No to chyba zamotałem, bo nie do końca o to mi chodziło :).

Zakładając że wykona się nasz najgłębszy if/elif. else nie powinien zadziałać.
W momencie kiedy jednak dojdzie do else, przechodzi zawsze do tego samego, nie ważne na którym jest zagłębieniu.

Na funkcje potrafię podzielić, zmienną pomocniczą także potrafię utworzyć, to pytanie z kategorii:
'Pomyślałem sobie że fajne by było coś takiego, a zapytam czy może coś takiego jest, a ja po prostu nie miałem okazji się natknąć.'

0

Ten drugi przykład wyjdzie podobnie, gdy będzie zrobiony w grafie, po wskaźnikach skacząc jeśli true to skok tu, false tu.
title

0

Nie dałoby rady tego skrócić do postaci mniej więcej:

if(not (warunek1 and warunek2 and warunek21 and warunek3)):
    var1=abc

?

1

No ale ten wspólny "else" wciąż jest wykonywalny za pomocą funkcji. Możesz np.

def fun():
 if warunek1:
    if warunek2:
      if warunek21:
        return True
    elif warunek3:
      return True
 return False

if not fun():
  var1 = abc

Ewentualnie pobawić się z wyjątkami dla przejrzystości kodu i jasności co gdzie wystąpiło (np. raise NotWarunek1, NotWarunek2 a potem except NotWarunek1,NotWarunek2:.
0

To co opisujesz jest antywzorcem (no i mechanizm if else tego nie wspiera), natomiast wyjątek zdaje się być rozwiązaniem, które jakoś tam może działać. Przydatna postać:

try:
    # ...
except TypWyjątku:
    pass
else:
    # dzieje się, jeśli żaden wyjątek typu TypWyjątku nie był podniesiony


No i pamiętaj, funkcje można deklarować lokalnie.

0

Dzięki za odpowiedzi :).
Czyli nie ma magicznego sposobu o którym pomyślałem, finalnie pozostanę przy funkcjach jak zaprezentował @AsterFV jest to chyba najszybsze rozwiązanie :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1