Неожиданное логическое поведение конечных элементов Python xml.etree.ElementTree

У меня возникли проблемы с использованием библиотеки Python 2.6.5 xml.etree.ElementTree. В частности, если я настрою простой элемент xml, например следующий

>>> import xml.etree.ElementTree as etree
>>> xml = etree.fromstring("<a><b><c>xy</c></b></a>")

у меня нет проблем с библиотекой при доступе к узлам внутренних элементов, например:

>>> etree.tostring(xml.find('b'))
'<b><c>xy</c></b>'
>>> xml.find('b') == None
False
>>> bool(xml.find('b'))
True

Однако я сталкиваюсь со странной логической интерпретацией узлов листовых элементов, см.:

>>> etree.tostring(xml.find('b/c'))
'<c>xy</c>'
>>> xml.find('b/c') == None
False
>>> bool(xml.find('b/c'))
False

Обратите внимание, что в последней команде элемент xml.find('b/c'), который явно не равен None, оценивается как False. Это особенно раздражает, так как я не могу использовать идиому

>>> leaf = xml.find('b/c'):
>>> if leaf:
>>>     do_stuff(leaf)

чтобы проверить, существует ли листовой элемент. (Мне нужно явно проверить 'xml.find('b/c') != None'.)

Может кто-нибудь объяснить это (для меня неожиданное) поведение?


person MRA    schedule 26.07.2012    source источник
comment
Приложение: я не прошу, чтобы другие библиотеки Python обрабатывали xml, я просто хочу понять поведение данного пакета библиотеки.   -  person MRA    schedule 26.07.2012


Ответы (1)


Хорошо, извините, после отправки этого вопроса я нашел явное описание решения в документации Python: http://docs.python.org/release/2.6.5/library/xml.etree.elementtree.html#the-element-interface , в конце раздела.

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

Извините за беспокойство.

person MRA    schedule 26.07.2012