Skip to content

Commit 0444167

Browse files
nikifkonakx
andauthored
LazyProxy: Handle AttributeError in specified func (#724)
Fixes #723 Co-authored-by: Aarni Koskela <akx@iki.fi>
1 parent e0e6aa6 commit 0444167

2 files changed

Lines changed: 21 additions & 2 deletions

File tree

babel/support.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ class LazyProxy(object):
165165
Hello, universe!
166166
Hello, world!
167167
"""
168-
__slots__ = ['_func', '_args', '_kwargs', '_value', '_is_cache_enabled']
168+
__slots__ = ['_func', '_args', '_kwargs', '_value', '_is_cache_enabled', '_attribute_error']
169169

170170
def __init__(self, func, *args, **kwargs):
171171
is_cache_enabled = kwargs.pop('enable_cache', True)
@@ -175,11 +175,17 @@ def __init__(self, func, *args, **kwargs):
175175
object.__setattr__(self, '_kwargs', kwargs)
176176
object.__setattr__(self, '_is_cache_enabled', is_cache_enabled)
177177
object.__setattr__(self, '_value', None)
178+
object.__setattr__(self, '_attribute_error', None)
178179

179180
@property
180181
def value(self):
181182
if self._value is None:
182-
value = self._func(*self._args, **self._kwargs)
183+
try:
184+
value = self._func(*self._args, **self._kwargs)
185+
except AttributeError as error:
186+
object.__setattr__(self, '_attribute_error', error)
187+
raise
188+
183189
if not self._is_cache_enabled:
184190
return value
185191
object.__setattr__(self, '_value', value)
@@ -249,6 +255,8 @@ def __delattr__(self, name):
249255
delattr(self.value, name)
250256

251257
def __getattr__(self, name):
258+
if self._attribute_error is not None:
259+
raise self._attribute_error
252260
return getattr(self.value, name)
253261

254262
def __setattr__(self, name, value):

tests/test_support.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,17 @@ def first(xs):
279279
self.assertEqual(2, proxy.value)
280280
self.assertEqual(1, proxy_deepcopy.value)
281281

282+
def test_handle_attribute_error(self):
283+
284+
def raise_attribute_error():
285+
raise AttributeError('message')
286+
287+
proxy = support.LazyProxy(raise_attribute_error)
288+
with pytest.raises(AttributeError) as exception:
289+
proxy.value
290+
291+
self.assertEqual('message', str(exception.value))
292+
282293

283294
def test_format_date():
284295
fmt = support.Format('en_US')

0 commit comments

Comments
 (0)