[pypy-svn] r58765 - in pypy/branch/2.5-merge/pypy/module/operator: . test
jlg at codespeak.net
jlg at codespeak.net
Tue Oct 7 16:51:24 CEST 2008
Author: jlg
Date: Tue Oct 7 16:51:22 2008
New Revision: 58765
Modified:
pypy/branch/2.5-merge/pypy/module/operator/app_operator.py
pypy/branch/2.5-merge/pypy/module/operator/test/test_operator.py
Log:
test and implementation of support for multiple gets in attrgetter() and itemgetter()
Modified: pypy/branch/2.5-merge/pypy/module/operator/app_operator.py
==============================================================================
--- pypy/branch/2.5-merge/pypy/module/operator/app_operator.py (original)
+++ pypy/branch/2.5-merge/pypy/module/operator/app_operator.py Tue Oct 7 16:51:22 2008
@@ -65,18 +65,31 @@
class attrgetter(object):
- def __init__(self, name):
- self.name = name
+ def __init__(self, attr, *args):
+ self.attrs = args
+ self.attr = attr
def __call__(self, obj):
- return getattr(obj, self.name)
+ result = getattr(obj, self.attr)
+
+ if self.attrs:
+ list = [result] + [getattr(obj, attr) for attr in self.attrs]
+ return tuple(list)
+
+ return result
class itemgetter(object):
- def __init__(self, index):
- self.index = index
+ def __init__(self, item, *args):
+ self.items = args
+ self.item = item
def __call__(self, obj):
- return obj[self.index]
+ result = obj[self.item]
+
+ if self.items:
+ list = [result] + [obj[item] for item in self.items]
+ return tuple(list)
+
+ return result
-
Modified: pypy/branch/2.5-merge/pypy/module/operator/test/test_operator.py
==============================================================================
--- pypy/branch/2.5-merge/pypy/module/operator/test/test_operator.py (original)
+++ pypy/branch/2.5-merge/pypy/module/operator/test/test_operator.py Tue Oct 7 16:51:22 2008
@@ -15,3 +15,23 @@
assert a.get3("foobar") == "b"
assert a.getx(*(a,)) == 5
assert a.get3(obj="foobar") == "b"
+
+
+ def test_getter_multiple_gest(self):
+ import operator
+
+ class A(object):
+ pass
+
+ a = A()
+ a.x = 'X'
+ a.y = 'Y'
+ a.z = 'Z'
+
+ assert operator.attrgetter('x','z','y')(a) == ('X', 'Z', 'Y')
+ raises(TypeError, operator.attrgetter('x', (), 'y'), a)
+
+ data = map(str, range(20))
+ assert operator.itemgetter(2,10,5)(data) == ('2', '10', '5')
+ raises(TypeError, operator.itemgetter(2, 'x', 5), data)
+
More information about the Pypy-commit
mailing list