2014-05-12 3 views
6

не Безопасно ли проверить, является ли переменная myvar не-None значение просто:Проверьте XML ElementTree узел None/Ложные

if myvar: 
    print('Not None detected') 

Я спрашиваю это потому, что у меня есть переменная и проверки, является ли переменная не была None просто if variable:, но проверка не удалась. Переменная содержит некоторые данные, но она проверяет значение False в if.

Полный код:

from xml.etree import ElementTree as ElementTree 

root = ElementTree.fromstring('Some xml string') 

parameters = root.find('Some Tag') 

udh = parameters.find('UDH') 

if udh and udh.text: # In this line the check is failing, though the udh variable has value: <Element 'UDH' at 0x7ff614337208> 
    udh = udh.text 
    # Other code 
else: 
    print('No UDH!') # Getting this output 
+0

Это на самом деле неправильно. '' if myvar: '' при условии, что '' myvar'' '' None'' на самом деле не будет оцениваться '' True'', и поэтому ваш образец не будет работать. Однако лучше использовать форму: '' если myvar не является None: '' или '', если myvar is None: '' –

+0

Был здесь: http://stackoverflow.com/questions/3965104/not-none -test-in-python – ka2m

+0

Разве ваш чек не работает, потому что в udh нет текста? Это может быть пустой узел XML. – Midnighter

ответ

5

В Python логическое значение (истина) объекта необязательно равно None или нет. Правильность этого предположения зависит от того, правильно ли выбран ваш объект надлежащим образом. Что касается Python 2.7:

object.__nonzero__(self)

Вызывается для реализации тестирования значения истинности и встроенная операция bool(); должны возвращать False или True или их целые эквиваленты 0 или 1. Когда этот метод не определен, вызывается __len__(), если он определен, и объект считается истинным, если его результат отличен от нуля. Если класс не определяет ни __len__(), ни __nonzero__(), все его экземпляры считаются истинными.

также посмотреть на PEP 8, что обеспечивает руководство по этому вопросу (курсив мой):

Сравнения к одиночек, как None всегда должны быть сделаны с is или is not, никогда операторов равенства ,

Кроме того, остерегайтесь писать if x, если вы действительно имеете в виду if x is not None - например. при проверке того, была ли переменная или аргумент, который по умолчанию равен None, был установлен на какое-то другое значение. Другое значение может иметь тип (например, контейнер), который может быть ложным в булевом контексте!

Поэтому, чтобы безопасно проверить есть ли у вас None или not None вы должны использовать именно:

if myvar is None: 
    pass 
elif myvar is not None: 
    pass 

В случае xml.etree.ElementTree.Element семантики булевой оценки отличаются от None -ness объекта:

Для справки:

+3

[pep 8] (http://legacy.python.org/dev/peps/pep-0008/#programming-recommendations) также говорит об этом: * Также будьте осторожны с написанием '' if x'', когда вы действительно означает '' if x is not None'' * –

+1

@JonasWielicki спасибо за эту ссылку! – moooeeeep

+0

Большое спасибо за ваш ответ. Можете ли вы рассказать, что происходит в Python 3 для оценки того, может ли значение, указанное переменной, быть логическим? – giga

2

ElementTree поведения для узлов без детей является пресловутым отходом от стандартной практики Python. В общем, было бы безопасно использовать переменную в вашем условии if и предположить, что логическое значение разумно. В этом случае, как вы испытали из первых рук, вам нужно будет сделать более явную проверку.

1

В вашем случае, это безопасно, так как ElementTree returns False to the __nonzero__ test, чтобы проверить, если элемент был найден или не.

Однако, как говорит доктор, то лучше проверить явно, с is None, если вы хотите, чтобы проверить, если элемент не был найден:

Внимание: Поскольку объекты Элемент не определен nonzero() метод, элементы без подэлементов будут проверяться как False.

element = root.find('foo') 

if not element: # careful! 
    print "element not found, or element has no subelements" 

if element is None: 
    print "element not found" 

Для напоминания, object.__nonzero__ используется в тестировании значения и в bool() операции.

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