Custom namespaces

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Sat Aug 1 21:06:47 EDT 2009


I was playing around with a custom mapping type, and I wanted to use it 
as a namespace, so I tried to use it as my module __dict__:

>>> import __main__
>>> __main__.__dict__ = MyNamespace()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: readonly attribute

Why is __dict__ made read-only?

I next thought I could change the type of the namespace to my class:

>>> __main__.__dict__.__class__ = MyNamespace
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __class__ assignment: only for heap types

Drat, foiled again!!!

Okay, if I can't do this at the module level, can I at least install a 
custom namespace at the class level?

>>> class MyNamespace(dict):
...     def __getitem__(self, key):
...             print "Looking up key '%s'" % key
...             return super(MyNamespace, self).__getitem__(key)
...
>>> namespace = MyNamespace(x=1, y=2, z=3)
>>> namespace['x']
Looking up key 'x'
1
>>> C = new.classobj("C", (object,), namespace)
>>> C.x
1

Apparently not. It looks like the namespace provided to the class 
constructor gets copied when the class is made.

Interestingly enough, the namespace argument gets modified *before* it 
gets copied, which has an unwanted side-effect:

>>> namespace
{'y': 2, 'x': 1, '__module__': '__main__', 'z': 3, '__doc__': None}


Is there any way to install a custom type as a namespace?



-- 
Steven



More information about the Python-list mailing list