Better function arity checking. Fixed a raise statement.
authorFrederic Jolliton <frederic@jolliton.com>
Sun, 11 Sep 2005 05:39:30 +0000 (05:39 +0000)
committerFrederic Jolliton <frederic@jolliton.com>
Sun, 11 Sep 2005 05:39:30 +0000 (05:39 +0000)
 * Enhanced functionArity to return None as maximum number of parameters
   in case where the function is declared with a *args style argument.
git-archimport-id: frederic@jolliton.com--2005-main/tx--main--0.1--patch-18

xpath.py

index 8a53b79..f647e8c 100644 (file)
--- a/xpath.py
+++ b/xpath.py
@@ -75,10 +75,14 @@ binaryOperators = {
        , 'ne'        : opValueNotEqual
        , 'lt'        : opValueLessThan
        , 'gt'        : opValueGreaterThan
+       , 'le'        : opValueLessOrEqual
+       , 'ge'        : opValueGreaterOrEqual
        , '='         : opGeneralEqual
        , '!='        : opGeneralNotEqual
        , '<'         : opGeneralLessThan
        , '>'         : opGeneralGreaterThan
+       , '<='        : opGeneralLessOrEqual
+       , '>='        : opGeneralGreaterOrEqual
        , 'is'        : opIsSameNode
        , '<<'        : opNodeBefore
        , '>>'        : opNodeAfter
@@ -98,7 +102,11 @@ binaryOperators = {
 def functionArity( f ) :
 
        n = f.func_code.co_argcount
-       return n - len( f.func_defaults or () ) , n
+       min = n - len( f.func_defaults or () )
+       max = n
+       if f.func_code.co_flags & 4 :
+               max = None
+       return min , max
 
 def assertFunctionArity( fun , label , n , diff = 0 ) :
 
@@ -114,7 +122,7 @@ def assertFunctionArity( fun , label , n , diff = 0 ) :
        else :
                if n + diff < range[ 0 ] :
                        error = 'at least %d' % ( range[ 0 ] - diff ) , range[ 0 ] - diff
-               elif n + diff > range[ 1 ] :
+               elif range[ 1 ] is not None and n + diff > range[ 1 ] :
                        error = 'at most %d' % ( range[ 1 ] - diff ) , range[ 1 ] - diff
        if error is not None :
                raise XPathError( 'XPST0017' ,
@@ -394,7 +402,7 @@ def makeVariableReference( name ) :
 def makeAxis( it , test ) :
 
        if it is None :
-               raise XError( 'XPST0010' )
+               raise XPathError( 'XPST0010' , 'Unsupported axis' )
        def fun( context ) :
                return Sequence( node for node in it( context.item ) if test( node ) )
        fun.__name__ = '_iterate_'