From: Ivan V. i B. <iv...@ca...> - 2006-10-16 10:48:18
|
Looking at the ``ophelper()`` decorator in the ``expressions`` module of Numexpr, I see the following code is used to check/replace arguments of operators:: for i, x in enumerate(args): if isConstant(x): args[i] =3D x =3D ConstantNode(x) if not isinstance(x, ExpressionNode): return NotImplemented This looks like operations on unknown kinds of arguments use the default Python behaviour. However, this yields some strange results: >>> import numpy >>> a =3D numpy.array([1,1,1]) >>> import numexpr >>> numexpr.evaluate('a < [0,0,0]') array(True, dtype=3Dbool) This is odd because the comparison was not element-wise, but object-wise (between a VariableNode and an -unsupported- python list). Since Numexpr only understands scalar constants, variables and some functions (the last two are expression nodes), it seems more correct to me to simply forbid unsupported objects to avoid surprises, so the previous code may look like this:: for i, x in enumerate(args): if isConstant(x): args[i] =3D ConstantNode(x) elif not isinstance(x, ExpressionNode): raise TypeError( "unsupported object type: %s", type(x) ) Do you think this is OK, or am I wrong or missing something? Cheers, :: Ivan Vilata i Balaguer >qo< http://www.carabos.com/ C=C3=A1rabos Coop. V. V V Enjoy Data "" |