Overriding functions in the default namespace

Bug #1818807 reported by Victoria Dlugopolskaya
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
lxml
Confirmed
Low
Unassigned
lxml (Ubuntu)
New
Undecided
Unassigned

Bug Description

If I specify a namespace with a prefix, a custom function works fine:

from lxml import etree
_function_ns = etree.FunctionNamespace('http://example.com')
_function_ns.prefix = 'a'
def _dummy_count(arg):
 return 10
_function_ns['count'] = _dummy_count
_xml = etree.Element('structure')
print _xml.xpath('a:count()')

Output is '10.0'.

But if I add the function to the default namespace, I've got an error:

from lxml import etree
_function_ns = etree.FunctionNamespace(None)
def _dummy_count(arg):
 return 10
_function_ns['count'] = _dummy_count
_xml = etree.Element('structure')
print _xml.xpath('count()')

Output:

Traceback (most recent call last):
  File "/Users/user/Desktop/function-namespace.py", line 7, in <module>
    print _xml.xpath('count()')
  File "src/lxml/etree.pyx", line 1575, in lxml.etree._Element.xpath
  File "src/lxml/xpath.pxi", line 307, in lxml.etree.XPathElementEvaluator.__call__
  File "src/lxml/xpath.pxi", line 227, in lxml.etree._XPathEvaluatorBase._handle_result
lxml.etree.XPathEvalError: Invalid number of arguments

Seems it doesn't recognise my 'count(arg)' function and use standard 'count(...)' instead.

It works fine with custom functions that are not conflicting with standard functions, but how can I specify a custom function with one of the standard functions name?

---

Python : sys.version_info(major=2, minor=7, micro=15, releaselevel='final', serial=0)
lxml.etree : (4, 3, 0, 0)
libxml used : (2, 9, 9)
libxml compiled : (2, 9, 9)
libxslt used : (1, 1, 32)
libxslt compiled : (1, 1, 32)

description: updated
Revision history for this message
scoder (scoder) wrote :

Hmm, looks like the functions are registered in the wrong order: local first, then global, then EXSLT. Local functions should take precendence. PR welcome, see the _XPathContext class in "xpath.pxi".

Changed in lxml:
importance: Undecided → Low
status: New → Confirmed
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.