2012-02-22 5 views
30

Это довольно простой, но я был кодированием и начал задаваться вопросом, существует ли питонический способ проверить, нет ли чего-то. Вот как я это сделать, если это правда:pythonic способ проверить, существует ли что-то?

var = 1 
if var: 
    print 'it exists' 

, но когда я проверяю, если что-то не существует, я часто делаю что-то вроде этого:

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

выглядит излишеством, если все, что я забочусь о том kn? Есть ли способ проверить, если что-то не существует без другого?

+0

Всегда есть тройной: http://stackoverflow.com/questions/394809/python-ternary-operator :) ... думал, что это может быть не самый питонический способ написать его. – summea

+3

Если 'var' на самом деле не существует **, то вы получите исключение, возникшее при попытке его использовать. Это вне того, что 'if' /' else' может обрабатывать. 'if var' ** предполагает **, что' var' существует, и ** проверяет **, если это «true-ish» (становится True, а не False, если преобразован в boolean). –

+1

Вы не проверяете существование переменной, но проверяете, является ли это значение «True» - логическим контекстом. – FallenAngel

ответ

83

LBYL стиль, "семь раз отмерь":

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

ЭСПЦ стиль, "проще попросить прощения, чем разрешения":

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

Предпочитаю второй стиль (EAFP) при кодировании в Python, потому что он, как правило, более надежный.

+0

Тест, если var не существует: 'var' не в locals() и 'var' не в globals() – MyopicVisage

16

Я думаю, вы должны быть осторожны с терминологией, существует ли что-тои что-то имеет значение Ложные две разные вещи. Предполагая, что вы хотите, последний, вы можете просто сделать:

if not var: 
    print 'var is False' 

Для первых, это было бы менее элегантна:

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

Я собираюсь совершить прыжок и предприятие, однако, что все что вы хотите проверить, определена ли переменная, может быть, вероятно, более элегантно.

+0

извините, это не значит false. если это не существует. Я использую его чаще в sql-запросах (я обертываю оператор if в запросе select, и если результат не возвращается, я делаю некоторую работу), поэтому не нужно искать false. – Lostsoul

+0

well 'config = config()', а затем 'if not config:' дает мне локальную переменную config, указанную перед настройкой ":) – holms

0

Как насчет отрицания?

if not var: 
    print 'nope it does not' 

Хотя это увидеть, если переменная не является ложным/нет и взорвется, если переменная не определена.

Чтобы увидеть, если переменная определена:

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' 

в Python, если varibale оказывает какое-либо значение из None/False/0, то условие If var подведет ...

и для других объекты он назовет __nonzero__ метод pythonic, который может возвращать True или False в зависимости от его функциональности.

+2

Это не будет обрабатывать случай, когда переменная никогда не была определена, что является вопросом OP. – btown

2

Чтобы проверить, является ли переменная была определена:

var = 2 

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

Чтобы проверить, если он не является None/Ложные

if varz is None 

... или

if not varz 
2

Если это словарь, вы можете получить

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

Однако has_key() полностью удаляется из Python 3.x, поэтому, как Python является использование in

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

Вы можете использовать in для кортежа, списка, и установить, а также.


Конечно, если переменная не определена, то придется вызывать исключение молча (просто поднять любое исключение ... пусть это пройти), если исключение не то, что вы хотите увидеть (что полезно для многих приложений, вам просто нужно войти исключение.)


это всегда безопасно, чтобы определить переменную, прежде чем использовать его (вы столкнетесь с «поручением, перед местным заданием», что означает "вар не входит в сферу действия «на простом английском языке»). Если вы делаете что-то с запросом, вероятность того, что вам понадобится словарь, и проверьте, существует ли ключ или нет, используйте in.

+0

Простейший из всех решений – DrStrangepork

Смежные вопросы