2013-04-04 9 views
9

natknąłem się this widocznie strasznym fragment kodu:python: w ""?

def determine_db_name(): 
    if wallet_name in "": 
     return "wallet.dat" 
    else: 
     return wallet_name 

Co ma if xx in "": znaczyć? Czy nie zawsze ocenia się na False?

+5

Może oznaczało równie straszne 'jeśli wallet_name jest„”' i typoed do czegoś, co jest przypadkiem nieco bardziej poprawne? – geoffspear

+1

przerażający, rzeczywiście –

+1

lol @ Zamknij głosowanie? –

Odpowiedz

13

To będzie powrót True jeśli wallet_name sama jest pusty:

>>> foo = '' 
>>> foo in '' 
True 

To jest przerażające jednak. Wystarczy użyć if not wallet_name: zamiast lub użyj or i pozbycie się ze stwierdzeniem if sumie:

def determine_db_name(): 
    return wallet_name or "wallet.dat" 

który działa, ponieważ or zwarć, wracając wallet_name jeśli nie jest to pusty ciąg znaków, inaczej "wallet.dat" jest zwracany.

+0

Powinno to brzmieć: 'return wallet_name if wallet_name else" wallet.dat "' Używanie 'lub'/'i' jako warunkowe wyrażenie. nie jest bardzo pytoniczny. – Ber

+4

@Ber: Tak jest w tym przypadku. Używanie wyrażenia warunkowego jest tutaj przesadzone. Jeśli użyjesz 'testexpression i truevalue lub falsevalue' wtedy lepszym wyborem będzie wyrażenie warunkowe (unikanie problemów z false-y' truevalue', ale dla prostej 'potencjalnie pustej lub fallbackvalue' * powyższej idealnie doskonale * i najlepiej wszystkich, * bardziej czytelne * niż bardziej szczegółowe wyrażenie warunkowe –

+1

'wallet_name lub" wallet.dat "' jest świetne. –

7

To wyrażenie jest prawdziwe, jeśli wallet_name jest pustym łańcuchem.

Prawdopodobnie byłoby bardziej przejrzyste, jeśli kod został napisany w sposób następujący:

if wallet_name == '': 

lub po prostu:

if not wallet_name: 
0

Zazwyczaj in służy do sprawdzania, czy klucz istnieje w tablicy lub element istnieje na liście.

>>> 2 in [1,2,3] 
True 
>>> 6 in [1,2,3] 
False 
>>> 'foo' in {'bar', 'foo', 'baz'} 
True 

Ale to działa na smyczki, a także:

>>> 'foo' in 'barfoobar' 
True 
>>> 'foo' in 'barbarbar' 
False