[Python-Dev] Why not support user defined operator overloading ?

Steven D'Aprano steve at pearwood.info
Mon Sep 30 01:31:32 CEST 2013


On Sun, Sep 29, 2013 at 03:35:27PM -0400, Ned Batchelder wrote:

> It isn't just a matter of a more complex parser: where would the parser 
> get the information about these new operators?  The obvious first answer 
> is that they would be defined as part of classes, but that means the 
> operator definition is in an imported module some place.  The importing 
> module couldn't even be parsed until the class was imported.  This is a 
> completely different compilation and execution model than Python has now.

The obvious place to define the operator's action is a class, but there 
is no need to define new syntax at runtime. The parser doesn't need to 
know the operator's action until runtime, no different from existing 
operators.

For avoidance of doubt, I'm not suggesting this as a concrete proposal, 
just as a hypothetical. But if somebody wants to take it seriously 
and write up a PEP, here are two possibilities to get you started:

* Unicode characters. It's 2013, and anyone still using an editor which 
only handles ASCII shouldn't be :-) There are dozens of non-alphanumeric 
characters in Unicode that are suitable as operators. Unless I've 
missed one, all the existing operators have category 'Sm', 'Sk', 
'Po', or 'Pd', so Python might parse any character in those categories 
as a potential operator. E.g. all of these are in category Sm:

∈ ∉ ≠ ⊂ ⊃ ⊕ ⊖ ⊗ ⊘

* ASCII digraphs. A more conservative approach would be to define custom 
operators as two characters, not one. Say, @X might be parsed as 
operator X.

In either case, having parsed "spam @X eggs" or "spam ⊂ eggs", the 
interpreter could do this:

call spam.__op__('X', eggs)  # or '⊂'
if that doesn't succeed, call eggs.__rop__('X', spam)
raise OperatorError

none of which need happen until runtime, same as existing operators.

If you want to also support unary operators (prefix or postfix) then the 
parsing rules presumably will become more complicated, but the basic 
principle remains: the parser needs a pre-defined "template" to 
recognise what looks like an operator, and that can be baked into the 
language definition. The actual meaning of the operator can be 
determined at run time.

Make no mistake, this is still a big change to Python's semantics. But 
it doesn't require Python to redefine syntax on the fly.


-- 
Steven


More information about the Python-Dev mailing list