[SciPy-dev] Adding to an array with __radd__()

Ed Schofield schofield at ftw.at
Tue Nov 1 09:37:38 CST 2005

Robert Cimrman wrote:

>I have just tested with:
>PyObject *isSequence( PyObject *input ) {
>   if (PySequence_Check( input )) {
>     return( PyBool_FromLong( 1 ) );
>   } else {
>     return( PyBool_FromLong( 0 ) );
>   }
>print isSequence( [] )
>print isSequence( (1,) )
>print isSequence( {} )
>print isSequence( scipy.sparse.dok_matrix( scipy.array( [[1,2,3]] ) ) )
>and got (Python 2.4.2):
>... so the problem is not in PySequence_Check(). The DOK matrix inherits 
>not only from dict, but also from spmatrix. Could this cause such a 
Ah, well done.  So a dict doesn't define PySequence_Check().  But,
according to my tests, neither does an instance of the spmatrix base
class.  Instead it seems that any class that inherits from a dict does
define PySequence_Check():

class E(dict):

d = {}
e = E()

print isSequence(d)
print isSequence(e)



Very strange.  The same is true with a class derived from UserDict.  Can
someone explain this behaviour?

Meanwhile it seems that any Python class instance that defines the
__getitem__ method has PySequence_Check() true by default.  Another
cruel trick!  Can this be overridden without using C?

I've found this (somewhat old) comment by GvR, admitting that the
sequence protocol is poorly defined:
Perhaps another PEP is in order?  Meanwhile I'll reapply my patch to
handle sequences more cautiously...

-- Ed

More information about the Scipy-dev mailing list