The following is a simplified example of the behaviour we’re seeing the Sunburnt library, which uses lxml:
Python 2.4.3 (#1, Sep 21 2011, 19:55:41)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import lxml.etree
>>> from lxml.builder import E
>>>
>>> class Foo(object):
... QUERY = E.query
...
... def test(self, q):
... return self.QUERY(q)
...
>>> foo = Foo()
>>> bar = foo.test('a')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<stdin>", line 5, in test
File "/opt/define/lib/python2.4/site-packages/lxml-2.2.7_r0-py2.4-linux-x86_64.egg/lxml/builder.py", line 47, in <lambda>
return lambda *args, **kwargs: func(tag, *args, **kwargs)
File "/opt/define/lib/python2.4/site-packages/lxml-2.2.7_r0-py2.4-linux-x86_64.egg/lxml/builder.py", line 220, in __call__
raise TypeError("bad argument type: %r" % item)
TypeError: bad argument type: <__main__.Foo object at 0x2b1a8a79ee10>
Python 2.7, lxml 2.7.7
>>> import lxml.etree
>>> from lxml.builder import E
>>>
>>> class Foo(object):
... QUERY = E.query
...
... def test(self, q):
... return self.QUERY(q)
...
>>> foo = Foo()
>>> bar = foo.test('a')
>>> print lxml.etree.tostring(bar)
<query>a</query>
I’m looking for guidance on whether the exception in Python 2.4 is due to a bug in lxml, incorrect usage in binding E.query to a class attribute, or perhaps an error on our part when building lxml on Redhat.
The Sunburnt code in which this occurred is SoldrDelete.delete_queries()
https://github.com/tow/sunburnt/blob/master/sunburnt/schema.py#L617
With thanks, Alex