setattr() oddness

Terry Reedy tjreedy at udel.edu
Fri Jan 15 21:12:19 EST 2010


On 1/15/2010 6:10 PM, Sean DiZazzo wrote:
> On Jan 15, 2:22 pm, Terry Reedy<tjre... at udel.edu>  wrote:
>> On 1/15/2010 3:37 PM, Sean DiZazzo wrote:
>>
>>> Should the following be legal?
>>
>>>>>> class TEST(object): pass
>>> ...
>>>>>> t = TEST()
>>>>>> setattr(t, "", "123")
>>>>>> getattr(t, "")
>>> '123'
>>
>> Different people have different opinions as to whether setattr (and
>> correspondingly getattr) should be strict or permissive as to whether or
>> not the 'name' string is a legal name. CPython is permissive. The
>> rationale is that checking would take time and prevent possible
>> legitimate use cases.
>>
>> CPython is actually looser than this. Try
>>
>> t.__dict__[1] = 2
>>
>> Now there is an 'attribute' whose 'name' is an int! -- and which can
>> only be accessed via the same trick of delving into the internals. This
>> is, however, implementation behavior that would go away if an
>> implementation used string-key-only dicts to store attributes.
>>
>> Terry Jan Reedy
>
> Interesting.  I can understand the "would take time" argument, but I
> don't see any legitimate use case for an attribute only accessible via
> getattr().  Well, at least not a pythonic use case.

That was my first thought, but one thing I thought of would be a proxy 
object for remote objects coded in a language with different name rules, 
or any situation where 'names' and values come over the wire to be 
stored and later retrieved, so that all 'foreign' attribute access was 
done with set/get/del/attr.

I expect that creative Python programmers have found other uses too.

Terry Jan Reedy





More information about the Python-list mailing list