Неисправен ли lxml при обработке атрибутов как словарей через attrib? - PullRequest
1 голос
/ 07 января 2012

Я пытаюсь перенести некоторый код с использования ElementTree на lxml.etree, и рано обнаружил ошибку:

>>> import lxml.etree as ET
>>> main = ET.Element("main")
>>> another = ET.Element("another", foo="bar")
>>> main.attrib.update(another.attrib)

Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    main.attrib.update(another.attrib)
  File "lxml.etree.pyx", line 2153, in lxml.etree._Attrib.update 
    (src/lxml/lxml.etree.c:46972)
ValueError: too many values to unpack (expected 2)

Но я могу обновить, используя следующее:

>>> main.attrib.update({'foo': 'bar'})

Это ошибка в lxml (версия 2.3) или я просто упускаю что-то очевидное?

1 Ответ

3 голосов
/ 07 января 2012

Я получаю ту же ошибку, не думайте, что это всего лишь 2,3 проблема.

Обход:

main.attrib.update(dict(another.attrib))

# or more efficient if it has many attributes:
main.attrib.update(another.attrib.iteritems())

UPDATE

lxml.etree._Attrib.update принимает dict или итерацию (источник) . Хотя _Attrib имеет интерфейс dict, это не экземпляр dict.

In [3]: type(another.attrib)
Out[3]: lxml.etree._Attrib

In [4]: isinstance(another.attrib, dict)
Out[4]: False

Итак, update пытается перебрать элементы как key, value. Может быть, это сделано для исполнения. Только lxml автор знает.

Способы его изменения в lxml:

  1. Подкласс dict.

  2. Проверка на hasattr(sequence_or_dict, 'items').

Я не знаком с Cython и не знаю, что лучше.

...