[Python-Dev] Non-string keys in type dict
Ethan Furman
ethan at stoneleaf.us
Thu Mar 8 17:22:41 CET 2012
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()
~Ethan~
More information about the Python-Dev
mailing list