[Python-Dev] Non-string keys in type dict

Guido van Rossum guido at python.org
Thu Mar 8 18:06:41 CET 2012


On Thu, Mar 8, 2012 at 8:22 AM, Ethan Furman <ethan at stoneleaf.us> wrote:
> Guido van Rossum wrote:
>
>> On Wed, Mar 7, 2012 at 11:43 PM, Ethan Furman wrote:
>>>
>>> Are you able to modify classes after class creation in Python 3? Without
>>> using a metaclass?
>>
>>
>> Yes, by assignment to attributes. The __dict__ is a read-only proxy,
>> but attribute assignment is allowed. (This is because the "new" type
>> system introduced in Python 2.2 needs to *track* changes to the dict;
>> it does this by tracking setattr/delattr calls, because dict doesn't
>> have a way to trigger a hook on changes.)
>
>
> Poorly phrased question -- I meant is it possible to add non-string-name
> attributes to classes after class creation.  During class creation we can do
> this:
>
> --> class Test:
> ...   ns = vars()
> ...   ns[42] = 'green eggs'
> ...   del ns
> ...
> --> Test
> <class '__main__.Test'>
> --> Test.__dict__
> dict_proxy({
>    '__module__': '__main__',
>    42: 'green eggs',
>    '__doc__': None,
>    '__dict__': <attribute '__dict__' of 'Test' objects>,
>    '__weakref__': <attribute '__weakref__' of 'Test' objects>,
>    '__locals__': {
>        42: 'green eggs',
>       '__module__': '__main__',
>       '__locals__': {...}}
>    })
> --> Test.__dict__[42]
> 'green eggs'
>
> A little more experimentation shows that not all is well, however:
>
> --> dir(Test)
> Traceback (most recent call last):
>  File "<stdin>", line 1, in <module>
> TypeError: unorderable types: int() < str()

So what conclusion do you draw?

-- 
--Guido van Rossum (python.org/~guido)


More information about the Python-Dev mailing list