<h2>回答:实际上,我们可以</h2>
<p>但不是一般情况。在</p>
<p>你需要一些魔法。在</p>
<p>magick被称为“自定义名称空间”。在</p>
<p>整个想法来自阿明·罗纳彻的演讲<a href="http://mitsuhiko.pocoo.org/badideas.pdf" rel="noreferrer">5 years of Bad Ideas</a>。在</p>
<h2>Magick:具有值历史记录的自定义命名空间</h2>
<p>让我们创建保存值历史记录的自定义命名空间。在</p>
<p>为了演示起见,让我们更改<code>__del__</code>的规则,而不是删除值,而是插入None。在</p>
<pre><code>from collections import MutableMapping
class HistoryNamespace(MutableMapping):
def __init__(self):
self.ns = {}
def __getitem__(self, key):
return self.ns[key][-1] # Rule 1. We return last value in history
def __delitem__(self, key):
self.ns[key].append(None) # Rule 4. Instead of delete we will insert None in history
def __setitem__(self, key, value): # Rule 3. Instead of update we insert value in history
if key in self.ns:
self.ns[key].append(value)
else:
self.ns[key] = list([value,]) # Rule 2. Instead of insert we create history list
def __len__(self):
return len(self.ns)
def __iter__(self):
return iter(self.ns)
history_locals = HistoryNamespace()
exec('''
foo=2
foo=3
del foo
foo=4
print(foo)
''', {}, history_locals)
print("History of foo:", history_locals.ns['foo'])
</code></pre>
<p>高兴吧!在</p>
<p>自定义名称空间是非常强大的技术,但几乎从未使用过。在</p>
<p>我觉得这个事实有点令人费解。在</p>