Python 3000 idea: reversing the order of chained assignments

John Nagle nagle at animats.com
Thu Mar 22 12:21:12 EDT 2007


Mark T wrote:
> 
> "Alex Martelli" <aleax at mac.com> wrote in message 
> news:1hvcadb.134pbvp1y39wi3N%aleax at mac.com...
> 
>> John Nagle <nagle at animats.com> wrote:
>>
>>> Marcin Ciura wrote:
>>>
>>> > Neither would I. I must have expressed myself not clearly enough.
>>> > Currently
>>> > x = y = z
>>> > is roughly equivalent to
>>> > x = z
>>> > y = z
>>> > I propose to change it to
>>> > y = z
>>> > x = z
>>>
>>> Actually, it is equivalent to
>>>
>>>       y = z
>>>       x = y
>>
>>
>> Not really:
>>
>>>>> class chatty(object):
>>
>> ...   def __init__(self): self.__dict__['__hide'] = {}
>> ...   def __setattr__(self, name, value):
>> ...     print 'sa', name, value
>> ...     self.__dict__['__hide'][name] = value
>> ...   def __getattr__(self, name):
>> ...     print 'ga', name
>> ...     return self.__dict__['__hide'].get(name)
>> ...
>>
>>>>> c = chatty()
>>>>> x = c.zop = 23
>>
>> sa zop 23
>>
>>>>>
>>
>> As you can see, there is no read-access to c.zop, which plays the role
>> of y there.
>>
>>
>> Alex
> 
> 
> This is interesting:
> 
>>>> class Test(object):
> 
> ...   def __getattribute__(self,n):
> ...     print 'reading',n
> ...     return object.__getattribute__(self,n)
> ...   def __setattr__(self,n,v):
> ...     print 'writing',n,v
> ...     return object.__setattr__(self,n,v)
> ...
> 
>>>> x=Test()
>>>> x.a=1; x.b=2; x.c=3
> 
> writing a 1
> writing b 2
> writing c 3
> 
>>>> x.a=x.b=x.c
> 
> reading c
> writing a 3
> writing b 3
> 
>>>>
> 
> I wouldn't have expected "a" to be assigned first in a right-to-left 
> parsing order.  The result is the same in any case.
> 
> -Mark T.

    That's fascinating.  Is that a documented feature of the language,
or a quirk of the CPython interpreter?

				John Nagle



More information about the Python-list mailing list