Guard against AttributeError in dataloaders. (#161)

A solution for https://github.com/williamFalcon/pytorch-lightning/issues/142.
Since hasattr "calls getattr(object, name) and to see whether it raises an AttributeError or not", I replaced it with a single call to getattr.
See also https://stackoverflow.com/questions/24971061/python-hasattr-vs-getattr
This commit is contained in:
Sebastian Præsius 2019-08-23 14:21:39 +02:00 committed by William Falcon
parent cbb9821d9b
commit b31539f62e
1 changed files with 10 additions and 3 deletions

View File

@ -10,8 +10,15 @@ def data_loader(fn):
@property
def _data_loader(self):
if not hasattr(self, attr_name):
setattr(self, attr_name, fn(self))
return getattr(self, attr_name)
try:
value = getattr(self, attr_name)
except AttributeError:
try:
value = fn(self) # Lazy evaluation, done only once.
except AttributeError as e:
# Guard against AttributeError suppression. (Issue #142)
raise RuntimeError('An AttributeError was encountered: ' + str(e)) from e
setattr(self, attr_name, value) # Memoize evaluation.
return value
return _data_loader