[Python-Dev] [PATCH] Fix dictionary subclass semantics when used as global dictionaries

Crutcher Dunnavant crutcher at gmail.com
Wed Jan 11 02:09:27 CET 2006


This is the unittest that checks it. On trunk, the global and fall
through cases will fail, but they pass with the patch.
import unittest
from test import test_support
class DictSubclass(dict):
 get_notify_func = None
 def __getitem__(self, key):
 if self.get_notify_func:
 self.get_notify_func(key)
 return dict.__getitem__(self, key)
 set_notify_func = None
 def __setitem__(self, key, value):
 if self.set_notify_func:
 self.set_notify_func(key)
 return dict.__setitem__(self, key, value)
 del_notify_func = None
 def __delitem__(self, key):
 if self.del_notify_func:
 self.del_notify_func(key)
 return dict.__delitem__(self, key)
class DictSubclassExecTest(unittest.TestCase):
 def test_subclassexec_setlocal(self):
 d = DictSubclass()
 l = []
 d.set_notify_func = l.append
 exec "a = 1" in d
 d.set_notify_func = None
 self.assert_(d['a'] == 1)
 self.assert_('a' in l)
 def test_subclassexec_getlocal(self):
 d = DictSubclass()
 l = []
 d.get_notify_func = l.append
 exec "a = 1; a" in d
 d.get_notify_func = None
 self.assert_(d['a'] == 1)
 self.assert_('a' in l)
 def test_subclassexec_dellocal(self):
 d = DictSubclass()
 l = []
 d.del_notify_func = l.append
 exec "a = 1; del a" in d
 d.del_notify_func = None
 self.assert_(not d.has_key('a'))
 self.assert_('a' in l)
 def test_subclassexec_setglobal(self):
 d = DictSubclass()
 l = []
 d.set_notify_func = l.append
 exec "a = 1\ndef foo():\n\tglobal a\n\tpass" in d
 d.set_notify_func = None
 self.assert_(d['a'] == 1)
 self.assert_('a' in l)
 def test_subclassexec_getglobal(self):
 d = DictSubclass()
 l = []
 d.get_notify_func = l.append
 exec "a = 1; a\ndef foo():\n\tglobal a\n\tpass" in d
 d.get_notify_func = None
 self.assert_(d['a'] == 1)
 self.assert_('a' in l)
 def test_subclassexec_delglobal(self):
 d = DictSubclass()
 l = []
 d.del_notify_func = l.append
 exec "a = 1; del a\ndef foo():\n\tglobal a\n\tpass" in d
 d.del_notify_func = None
 self.assert_(not d.has_key('a'))
 self.assert_('a' in l)
 def test_subclassexec_getfallthrough(self):
 ld = DictSubclass()
 ll = []
 ld.get_notify_func = ll.append
 gd = DictSubclass()
 gl = []
 gd.get_notify_func = gl.append
 gd['a'] = 1
 exec 'b = a' in gd, ld
 gd.del_notify_func = None
 ld.del_notify_func = None
 self.assert_(ld['b'] == 1)
 self.assert_('a' in ll)
 self.assert_('a' in gl)
def test_main():
 test_support.run_unittest(
 DictSubclassExecTest,
 )
if __name__ == "__main__":
 test_main()
On 1/10/06, Crutcher Dunnavant <crutcher at gmail.com> wrote:
> 1402289
>> On 1/10/06, Aahz <aahz at pythoncraft.com> wrote:
> > On Tue, Jan 10, 2006, Crutcher Dunnavant wrote:
> > >
> > > There is an inconsistancy in the way that dictionary subclasses behave
> > > when they are used as as namespaces in execs.
> > >
> > > Basically, while python 2.4 permits the usage of dictionary subclasses
> > > for local environments, it still bypasses the subclass functions and
> > > uses the C API for global environments. The attached patch (and
> > > unittest!) addresses this issue.
> >
> > Please submit the patch to SourceForge and report back with the SF ID.
> > --
> > Aahz (aahz at pythoncraft.com) <*> http://www.pythoncraft.com/
> >
> > "19. A language that doesn't affect the way you think about programming,
> > is not worth knowing." --Alan Perlis
> >
>>> --
> Crutcher Dunnavant <crutcher at gmail.com>
> monket.samedi-studios.com
>
--
Crutcher Dunnavant <crutcher at gmail.com>
monket.samedi-studios.com


More information about the Python-Dev mailing list

AltStyle によって変換されたページ (->オリジナル) /