[Numpy-discussion] Possible new multiplication operators for Python

Andrew Dalke dalke at dalkescientific.com
Sun Aug 17 19:50:36 EDT 2008


On Aug 18, 2008, at 12:00 AM, Ondrej Certik wrote:
> There is some inconsistency though, for example one can override A() +
> A(), but one cannot override 1 + 1. This could (should) be fixed
> somehow.

That will never, ever change in Python.  There's no benefit
to being able to redefine int.__add__ and doing so will break
entirely too many assumptions.

Here's one assumption - the C implementation does some
simple constant folding:

 >>> def f():
...   print 1+1
...
 >>> import dis
 >>> dis.dis(f)
   2           0 LOAD_CONST               2 (2)
               3 PRINT_ITEM
               4 PRINT_NEWLINE
               5 LOAD_CONST               0 (None)
               8 RETURN_VALUE
 >>>

With what you want that's not possible.


Just think of the implementation difficulty.  Are changes on the
per-module or per-scope or per-thread level?  And performance
would be lousy (or require deep inferencing analysis) because
every operation in C would need to go through the Python API
just in case some fundamental definition like this was changed.

Such a language is possible.  I wouldn't be surprised if
you could do it in Smalltalk and mostly do it in Ruby.  But
the general belief is that good design follows the
"open/closed principle":

   "software entities (classes, modules, functions, etc.)
   should be open for extension, but closed for modification"
          - Bertrand Meyer, quoted by
             http://en.wikipedia.org/wiki/Open/closed_principle

In Python, all types are closed for modification, and
while classes are open for modification it's highly frowned
upon to do so.  The name "monkey-patch" sounds somewhat
derisive for a reason.



				Andrew
				dalke at dalkescientific.com





More information about the NumPy-Discussion mailing list