[Numpy-discussion] numarray unfriendly to user defined types

Todd Miller jmiller at stsci.edu
Wed Sep 24 16:01:05 EDT 2003

On Wed, 2003-09-24 at 18:27, Tim Hochberg wrote:
> Hi Todd,
> There are three ways to spell "defer to me" on the table (the precise 
> details of
> each spelling are, of course, still open for debate):
>    1.  numarray.defer_to(my_class)
>    2. class ArrayLike(numarray.DeferTo):
>          # ...
>    3. class ArrayLike:
>          _numarray_defer_to = True
>         # ...
> I'd prefer a non-registration solution since those are both 
> aesthetically displeasing and leave you open to the situation where a 
> class in module A gets registered by module B, but module C expects it 
> not to be registered and everything breaks. Not all that likely, I 
> admit, but let's avoid the registration version if we can.

I was picturing this as module A registering it's own classes only. 
Nevertheless, inverting the problem and distributing the registration as
you suggested is better.

> The other two solutions are almost equivalent. The one case where 3 has 
> an edge over 2 is if I have an object (not a class), I could potentially 
> set a _numarray_defer_to on the object before passing it to numarray 
> without having to mess with the class
> of the object at all. YAGNI, though.

I was more concerned about the potential impact of lots of multiple
inheritance, but that's probably just my own personal blend of FUD.

> The advantage of 2 in my view is that it *does* force you to subclass. 
> With 3, there will be the temptation to poke into some other  module and 
> set _numarray_defer_to on some poor unsuspecting class. This has the 
> same disadvantage as 1, that it could confuse some other poor 
> unsuspecting module. The correct way to do get a deferred class from a 
> third party module is to import and subclass. This works with either 2 
> or 3::
>   import A
>   class Klass2(a.Klass, numarray.DeferTo):   #2
>      #...
>   class Klass3(a.Klass): #3 the good way
>       _numarray_defer_to = True
>      # ...
>    A.Klass._numarray_defer_to = True #3 the evil way.
>  Version 2 is cleaner and encourages you to do the right thing, so I'd 
> prefer that solution.

Good enough for me.  If no one else has any comments, then
numarray.DeferTo is where I'll start implementing.  Tomorrow.

> regards,
> -tim

Thanks again,

More information about the NumPy-Discussion mailing list