2012-01-19 12 views
6

Mam następujący kod (minus kilka innych operacji):Zalecany sposób zainicjować zmienną, jeśli blok

def foobar(): 
    msg=None 
    if foo: 
     msg='foo' 
    else: 
     msg='bar' 
    return msg 

jest następujący lepsze praktyki dla zmiennej msg?

def foobar(): 
    if foo: 
     msg='foo' 
    else: 
     msg='bar' 
    return msg 

Jestem świadomy, że mogę uprościć powyższe funkcje wyrażeń trójskładnikowych, jednak istnieją operacje w każdym bloku if-else, że mam pominięta.

+0

zagłosuję za drugim. –

Odpowiedz

5

Albo powinno być w porządku, ale to pewnie zrobić:

def foobar(): 
    msg='bar' 
    if foo: 
     msg='foo' 
    return msg 
0

Jeśli to, co pokazałeś, jest wszystkim, w co angażuje się msg, to inicjowanie go nic nie robi dla ciebie, a drugie rozwiązanie jest lepsze.

3

W Pythonie nie ma wielkiej przewagi, aby zainicjować przed trybem warunkowym, jak w pierwszym przykładzie. Musisz tylko upewnić się, że zmienna jest inicjowana przed jej zwróceniem. To zakłada (na podstawie twoich przykładów), że używasz paradygmatu "pojedynczego wyjścia". W niektórych przypadkach w Pythonie jest to odpowiednie, ale w innych przypadkach dostajesz czystszy kod, wychodząc wcześniej, kiedy to możliwe.

def earlyReturn(mycheck): 
    if not mycheck: 
    return 'You forgot something.' 

    # code here if the test passes without needing an extra level of indentation. 
1

Zdecydowanie powiedziałbym, że później jest lepiej. Python nie zaleca inicjowania zmiennych. Dlatego należy tego unikać, jeśli nie dodaje do kodu czegoś wartościowego, jak wartość rezerwowa, lub czyni kod bardziej czytelnym, co w tym przypadku nie ma miejsca.

Edycja: Według wartości rezerwowej mam na myśli to samo, co zasugerował thagorn i mikebabcock.

0

Jeśli to cała logika, dlaczego nie zrobić:

def foobar(): 
    msg='bar' 
    if foo: 
     msg='foo' 
    return msg 
2

zdaję sobie sprawę, że istnieją pewne rzeczy pozostawione na zewnątrz, ale jeśli tak naprawdę nie musisz manipulować manipulować msg, wyobrażam sobie, że możesz po prostu zwrócić zamierzoną zawartość, nigdy nie potrzebując zmiennej; return 'foo'

4

Tylko dla kompletności, oto kilka alternatyw jedna linia do if/else bloki:

msg = 'foo' if foo else 'bar' 
msg = foo and 'foo' or 'bar' 
msg = ('bar', 'foo')[bool(foo)] 

Pierwszym z nich jest zdecydowanie najbardziej oczywiste, jeśli nie podoba ci się jedno-liner I zasugerowałbym użycie drugiej metody lub odpowiedzi na pytanie. Wywołanie bool() jest konieczne tylko w ostatnim przypadku, jeśli foo nie jest już boolem (lub 0/1).

Oczywiście w przykładowej funkcji można po prostu wrócić to natychmiast, nawet przy użyciu zmiennej msg:

def foobar(): 
    return 'foo' if foo else 'bar' 
+0

Ogólnie rzecz biorąc, dobra i kompleksowa porada, ale stwierdzili, że w blokach warunkowych jest więcej przetwarzania niż tylko to. – DigitalMan

Powiązane problemy