Skip to content

Commit

Permalink
correctly handle failure cases and support three-argument getattr
Browse files Browse the repository at this point in the history
  • Loading branch information
hannosch committed May 4, 2013
1 parent 511c336 commit d5cd0e8
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 3 deletions.
2 changes: 1 addition & 1 deletion CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Changelog
3.0 (unreleased)
----------------

- Add support for `__contains__`.
- Add support for `__contains__` and default argument to `getattr`.

- Rewrite tests as unit tests.

Expand Down
9 changes: 7 additions & 2 deletions src/Record/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,14 @@ def __getitem__(self, key):
raise TypeError('invalid record schema')
return self._data[pos]

def __getattr__(self, key):
def __getattr__(self, key, default=_marker):
if key in self.__slots__:
return object.__getattribute__(self, key)
try:
return self.__getitem__(key)
except KeyError:
if default is not _marker:
return default
raise AttributeError(key)

def __setitem__(self, key, value):
Expand All @@ -81,7 +83,10 @@ def __setattr__(self, key, value):
if key in self.__slots__:
object.__setattr__(self, key, value)
else:
self.__setitem__(key, value)
try:
self.__setitem__(key, value)
except KeyError:
raise AttributeError(key)

def __contains__(self, key):
return key in self._schema
5 changes: 5 additions & 0 deletions src/Record/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,9 @@ def test_attribute(self):
self.assertTrue(r.c is None)
r.a = 1
self.assertEqual(r.a, 1)
self.assertEqual(getattr(r, 'd', 2), 2)
self.assertRaises(AttributeError, getattr, r, 'd')
self.assertRaises(AttributeError, setattr, r, 'd', 2)

def test_mapping(self):
r = R()
Expand All @@ -93,6 +96,8 @@ def test_mapping(self):
r['b'] = 42
self.assertEqual(r['b'], 42)
self.assertEqual(r.b, 42)
self.assertRaises(KeyError, r.__getitem__, 'd')
self.assertRaises(KeyError, r.__setitem__, 'd', 2)

def test_sequence(self):
r = R()
Expand Down

0 comments on commit d5cd0e8

Please sign in to comment.