]> git.ipfire.org Git - thirdparty/babel.git/commitdiff
LazyProxy: Handle AttributeError in specified func (#724)
authorNikiforov Konstantin <kostya.nik.3854@gmail.com>
Wed, 30 Sep 2020 15:17:16 +0000 (20:17 +0500)
committerGitHub <noreply@github.com>
Wed, 30 Sep 2020 15:17:16 +0000 (18:17 +0300)
Fixes #723

Co-authored-by: Aarni Koskela <akx@iki.fi>
babel/support.py
tests/test_support.py

index efe41d5625409bdd1769b9a06c4aad597ba35901..47f812d8a41c2153d6ef5aacc275f3d1e8d1ad8e 100644 (file)
@@ -165,7 +165,7 @@ class LazyProxy(object):
     Hello, universe!
     Hello, world!
     """
-    __slots__ = ['_func', '_args', '_kwargs', '_value', '_is_cache_enabled']
+    __slots__ = ['_func', '_args', '_kwargs', '_value', '_is_cache_enabled', '_attribute_error']
 
     def __init__(self, func, *args, **kwargs):
         is_cache_enabled = kwargs.pop('enable_cache', True)
@@ -175,11 +175,17 @@ class LazyProxy(object):
         object.__setattr__(self, '_kwargs', kwargs)
         object.__setattr__(self, '_is_cache_enabled', is_cache_enabled)
         object.__setattr__(self, '_value', None)
+        object.__setattr__(self, '_attribute_error', None)
 
     @property
     def value(self):
         if self._value is None:
-            value = self._func(*self._args, **self._kwargs)
+            try:
+                value = self._func(*self._args, **self._kwargs)
+            except AttributeError as error:
+                object.__setattr__(self, '_attribute_error', error)
+                raise
+
             if not self._is_cache_enabled:
                 return value
             object.__setattr__(self, '_value', value)
@@ -249,6 +255,8 @@ class LazyProxy(object):
         delattr(self.value, name)
 
     def __getattr__(self, name):
+        if self._attribute_error is not None:
+            raise self._attribute_error
         return getattr(self.value, name)
 
     def __setattr__(self, name, value):
index b4dd823cdfbd0db425061a9d8a5784ee20ad7e78..1b74ae8bcf4fe2ff1ce1a45724cf73db7c6f62d3 100644 (file)
@@ -279,6 +279,17 @@ class LazyProxyTestCase(unittest.TestCase):
         self.assertEqual(2, proxy.value)
         self.assertEqual(1, proxy_deepcopy.value)
 
+    def test_handle_attribute_error(self):
+
+        def raise_attribute_error():
+            raise AttributeError('message')
+
+        proxy = support.LazyProxy(raise_attribute_error)
+        with pytest.raises(AttributeError) as exception:
+            proxy.value
+
+        self.assertEqual('message', str(exception.value))
+
 
 def test_format_date():
     fmt = support.Format('en_US')