2012-02-22 19 views
30

To jest dość proste, ale kodowałem i zacząłem się zastanawiać, czy istnieje pytony sposób sprawdzenia, czy coś nie istnieje. Oto jak to zrobić, czy to prawda:pytoniczny sposób sprawdzenia, czy coś istnieje?

var = 1 
if var: 
    print 'it exists' 

ale kiedy sprawdzić, czy coś nie istnieje, ja często zrobić coś takiego:

var = 2 
if var: 
    print 'it exists' 
else: 
    print 'nope it does not' 

wydaje się odpadów czy wszystko dbam o to Czy istnieje sposób na sprawdzenie, czy coś nie istnieje bez drugiego?

+0

Zawsze jest potrójny: http://stackoverflow.com/questions/394809/python-ternary-operator :) ... pomyślał, że może nie być najbardziej Pythonicznym sposobem na jego napisanie. – summea

+3

Jeśli 'var' tak naprawdę ** nie istnieje **, to otrzymasz wyjątek podniesiony, gdy spróbujesz go użyć. To jest poza tym, co "if"/"else" może obsłużyć. 'if var' ** zakłada **, że' var' istnieje i ** tests **, jeśli jest "true-ish" (staje się True zamiast false, jeśli jest skonwertowane na boolean). –

+1

Nie sprawdzasz istnienia zmiennej, ale sprawdzasz, czy jej wartość to "Prawda" jako kontekst logiczny. – FallenAngel

Odpowiedz

83

LBYL styl "patrzeć przed skokiem":

var_exists = 'var' in locals() or 'var' in globals() 

EAFP styl "łatwiej prosić o przebaczenie niż pozwolenie":

try: 
    var 
except NameError: 
    var_exists = False 
else: 
    var_exists = True 

Wolę drugą styl (EAFP) podczas kodowania Python, ponieważ generalnie jest bardziej niezawodny.

+0

Sprawdź, czy var nie istnieje: "var" nie w locals() i "var" not in globals() – MyopicVisage

16

Myślę, że trzeba być ostrożnym z terminologii, czy istnieje coś i coś ocenia się Fałsz są dwie różne rzeczy. Zakładając, że chcesz tego ostatniego, można po prostu zrobić:

if not var: 
    print 'var is False' 

Dla tych pierwszych, to byłoby mniej elegancki:

try: 
    var 
except NameError: 
    print 'var not defined' 

mam zamiar podjąć krok i przedsięwzięcie jednak, że niezależnie od sprawia, że ​​chcesz sprawdzić, czy zmienna jest zdefiniowana, prawdopodobnie można rozwiązać w bardziej elegancki sposób.

+0

Przepraszam, nie oznacza fałszywy. oznacza, jeśli nie istnieje. Używam go częściej w kwerendach sql (zawijam instrukcję if w kwerendzie select i jeśli nie ma wyniku, to wykonuję trochę pracy), więc nie jest to fałszywe szukanie nieistniejącego. – Lostsoul

+0

oraz 'config = config()', a następnie 'if not config:' daje mi "lokalną zmienną config, do której odwołuje się przed przypisaniem" :) – holms

0

Co z negacją?

if not var: 
    print 'nope it does not' 

Choć jest to aby sprawdzić, czy zmienna jest fałszywe/i nikt by wysadzić jeśli zmienna nie jest zdefiniowana.

Aby sprawdzić, czy zmienna jest zdefiniowana:

try: 
    var 
except NameError: 
    print 'not defined' 
0
if not var: 
    #Var is None/False/0/ 

if var: 
    #Var is other then 'None/False/0' 

w Pythonie jeśli varibale jest o dowolną wartość od None/Fałsz/0 następnie If var warunek nie powiedzie ...

i dla innych obiekty wywołają metodę pytona, która może zwrócić True lub False w zależności od jej funkcji.

+2

Nie zajmie się przypadkiem, w którym zmienna nigdy nie została zdefiniowana, co jest pytaniem OP. – btown

2

Aby sprawdzić, czy zmienna została zdefiniowana:

var = 2 

try: 
    varz 
except NameError: 
    print("No varz") 

Aby sprawdzić, czy jest to None/Fałsz

if varz is None 

... lub

if not varz 
2

Jeśli jest to słownik, możesz mieć

mydict['ggg'] = '' // doesn't matter if it is empty value or not. 
if mydict.has_key('ggg'): 
    print "OH GEESH" 

Jednak has_key() zostanie całkowicie usunięty z Pythona 3.x zatem sposób Python jest użycie in

'ggg' in mydict  # this is it! 
# True if it exists 
# False if it doesn't 

Można użyć in za krotki, listy i ustaw, jak również.


Oczywiście, jeśli zmienna nie została zdefiniowana, trzeba będzie podnieść wyjątek cicho (tylko podnieść żadnego wyjątku ... niech pass), jeśli wyjątek nie jest to, co chcesz zobaczyć (co jest przydatne w wielu zastosowaniach, wystarczy zalogować się wyjątek.)


jest zawsze bezpieczne zdefiniować zmienną przed jej użyciem (trafisz na „przydział przed miejscowym odniesienia”, co oznacza "var nie jest w zakresie "w prostym języku angielskim). Jeśli zrobisz coś z zapytaniem, szansa jest taka, że ​​będziesz chciał mieć słownik i sprawdzić, czy klucz istnieje, czy nie, użyj in.

+0

Najprostszy ze wszystkich rozwiązań – DrStrangepork

Powiązane problemy