S
Steven D'Aprano
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__:
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:
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?
.... def __getitem__(self, key):
.... print "Looking up key '%s'" % key
.... return super(MyNamespace, self).__getitem__(key)
....
11
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:
{'y': 2, 'x': 1, '__module__': '__main__', 'z': 3, '__doc__': None}
Is there any way to install a custom type as a namespace?
as a namespace, so I tried to use it as my module __dict__:
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:
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?
.... def __getitem__(self, key):
.... print "Looking up key '%s'" % key
.... return super(MyNamespace, self).__getitem__(key)
....
Looking up key 'x'namespace = MyNamespace(x=1, y=2, z=3)
namespace['x']
11
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:
{'y': 2, 'x': 1, '__module__': '__main__', 'z': 3, '__doc__': None}
Is there any way to install a custom type as a namespace?