Fixed #18447 -- Made LazyObject unwrap on dict access.

Thanks Roman Gladkov and Zbigniew Siciarz.
This commit is contained in:
Aymeric Augustin 2013-03-18 11:09:29 +01:00
parent 7cf0f04230
commit 0efafa4c54
2 changed files with 24 additions and 1 deletions

View File

@ -249,9 +249,22 @@ class LazyObject(object):
"""
raise NotImplementedError
# introspection support:
# Introspection support
__dir__ = new_method_proxy(dir)
# Dictionary methods support
@new_method_proxy
def __getitem__(self, key):
return self[key]
@new_method_proxy
def __setitem__(self, key, value):
self[key] = value
@new_method_proxy
def __delitem__(self, key):
del self[key]
# Workaround for http://bugs.python.org/issue12370
_super = super

View File

@ -128,3 +128,13 @@ class TestUtilsSimpleLazyObject(TestCase):
self.assertEqual(unpickled, x)
self.assertEqual(six.text_type(unpickled), six.text_type(x))
self.assertEqual(unpickled.name, x.name)
def test_dict(self):
# See ticket #18447
lazydict = SimpleLazyObject(lambda: {'one': 1})
self.assertEqual(lazydict['one'], 1)
lazydict['one'] = -1
self.assertEqual(lazydict['one'], -1)
del lazydict['one']
with self.assertRaises(KeyError):
lazydict['one']