[Python-ideas] Assignment decorators (Re: The Descriptor Protocol...)

Steven D'Aprano steve at pearwood.info
Tue Mar 8 22:43:41 CET 2011


Larry Hastings wrote:
> 
> On 03/07/2011 10:50 PM, Raymond Hettinger wrote:
>> Just for the fun of it, here's my offering:
>>
>>      a := gizmo(arg1, arg2)
>>
>> is equivalent to
>>
>>      a = gimzo(arg1, arg2, __name__='a')
> 
> How do you call two assignment decorators with this syntax?

The obvious way:

a, b := gizmo(arg1, arg2), widget(arg3)
# a, b = gimzo(arg1, arg2, __name__='a'), widget(arg3, __name__='b')

A more important question, what happens if we do this?

a := obj


>> Advantages:
>>
>>    * Keep the current '@' notation unambiguous
> 
> I don't think any of the proposed annotation syntaxes have been ambiguous.

Perhaps ambiguous is the wrong word, but it certainly overloads the 
meaning of @ and gives it a second, quite different meaning. So much so 
that I claim that "assignment decorator" is completely the wrong term to 
use to describe it. The feature we're discussing is not an enhanced form 
of decoration, it is an enhanced form of *assignment*. I think Raymond 
has got it right, the only appropriate syntax is a variation of the 
assignment syntax.

In current Python, decoration refers to the idiom:

x = something
x = decorator(x)

Before the @ syntax was available, we still used decorators like this:

def x():
     pass

x = decorator(x)

Notice that it's the *def* that gives the magic "knows its own name" 
behaviour, not the decorator. The decorator is just a function. You can 
decorate objects that aren't functions or classes, just without the 
advantage of nice syntax. Critical to the idea of decoration is that the 
decorator function is a function that wraps or otherwise modifies an 
existing object.

The proposed behaviour is nothing like decoration. It doesn't wrap an 
existing object, but changes the compiler's behaviour when creating it 
in the first place. What is fundamental to this proposed functionality 
is the idea of the right hand side of assignment being aware of the name 
  which is the target of that assignment. There are currently three 
things which already do this:

* defining a class and assigning it to a name using the class keyword
* defining a function and assigning it to a name using the def keyword
* applying a decorator using the @ syntax

What these three things have in common is *assignment*, not decoration.



-- 
Steven




More information about the Python-ideas mailing list