[Zope-Checkins] SVN: Zope/branches/2.11/ backport r94905 to 2.11: Acquisition wrappers now correctly proxy `__iter__`.
Andreas Zeidler
az at zitc.de
Wed Jan 21 11:25:34 EST 2009
Log message for revision 94906:
backport r94905 to 2.11: Acquisition wrappers now correctly proxy `__iter__`.
Changed:
U Zope/branches/2.11/doc/CHANGES.txt
U Zope/branches/2.11/lib/python/Acquisition/_Acquisition.c
U Zope/branches/2.11/lib/python/Acquisition/tests.py
-=-
Modified: Zope/branches/2.11/doc/CHANGES.txt
===================================================================
--- Zope/branches/2.11/doc/CHANGES.txt 2009-01-21 16:04:11 UTC (rev 94905)
+++ Zope/branches/2.11/doc/CHANGES.txt 2009-01-21 16:25:34 UTC (rev 94906)
@@ -19,6 +19,8 @@
Bugs Fixed
+ - Acquisition wrappers now correctly proxy __iter__.
+
- Products.PluginIndexes.PathIndex: backported doc fixes /
optiimizations from trunk (and ExtendedPathIndex).
Modified: Zope/branches/2.11/lib/python/Acquisition/_Acquisition.c
===================================================================
--- Zope/branches/2.11/lib/python/Acquisition/_Acquisition.c 2009-01-21 16:04:11 UTC (rev 94905)
+++ Zope/branches/2.11/lib/python/Acquisition/_Acquisition.c 2009-01-21 16:25:34 UTC (rev 94906)
@@ -38,7 +38,8 @@
*py__long__, *py__float__, *py__oct__, *py__hex__,
*py__getitem__, *py__setitem__, *py__delitem__,
*py__getslice__, *py__setslice__, *py__delslice__, *py__contains__,
- *py__len__, *py__of__, *py__call__, *py__repr__, *py__str__, *py__cmp__;
+ *py__len__, *py__of__, *py__call__, *py__repr__, *py__str__, *py__cmp__,
+ *py__iter__;
static PyObject *Acquired=0;
@@ -82,6 +83,7 @@
INIT_PY_NAME(__repr__);
INIT_PY_NAME(__str__);
INIT_PY_NAME(__cmp__);
+ INIT_PY_NAME(__iter__);
#undef INIT_PY_NAME
}
@@ -817,6 +819,12 @@
return c;
}
+static PyObject *
+Wrapper_iter(Wrapper *self)
+{
+ return CallMethodO(OBJECT(self), py__iter__, NULL, NULL);
+}
+
static PySequenceMethods Wrapper_as_sequence = {
(inquiry)Wrapper_length, /*sq_length*/
(binaryfunc)Wrapper_add, /*sq_concat*/
@@ -1222,7 +1230,7 @@
/* tp_clear */ (inquiry)Wrapper_clear,
/* tp_richcompare */ (richcmpfunc)0,
/* tp_weaklistoffset */ (long)0,
- /* tp_iter */ (getiterfunc)0,
+ (getiterfunc)Wrapper_iter, /*tp_iter*/
/* tp_iternext */ (iternextfunc)0,
/* tp_methods */ Wrapper_methods,
/* tp_members */ 0,
@@ -1266,7 +1274,7 @@
/* tp_clear */ (inquiry)Wrapper_clear,
/* tp_richcompare */ (richcmpfunc)0,
/* tp_weaklistoffset */ (long)0,
- /* tp_iter */ (getiterfunc)0,
+ (getiterfunc)Wrapper_iter, /*tp_iter*/
/* tp_iternext */ (iternextfunc)0,
/* tp_methods */ Wrapper_methods,
/* tp_members */ 0,
Modified: Zope/branches/2.11/lib/python/Acquisition/tests.py
===================================================================
--- Zope/branches/2.11/lib/python/Acquisition/tests.py 2009-01-21 16:04:11 UTC (rev 94905)
+++ Zope/branches/2.11/lib/python/Acquisition/tests.py 2009-01-21 16:25:34 UTC (rev 94906)
@@ -1636,6 +1636,9 @@
... def __contains__(self, key):
... print 'contains', repr(key)
... return key == 5
+ ... def __iter__(self):
+ ... print 'iterating...'
+ ... return iter((42,))
The naked class behaves like this:
@@ -1646,6 +1649,9 @@
>>> 5 in c
contains 5
True
+ >>> list(c)
+ iterating...
+ [42]
Let's put c in the context of i:
@@ -1660,7 +1666,59 @@
>>> 5 in i.c
contains 5
True
+ >>> list(i.c)
+ iterating...
+ [42]
+ Let's let's test the same again with an explicit wrapper:
+
+ >>> import Acquisition
+ >>> class Impl(Acquisition.Explicit):
+ ... pass
+
+ >>> class C(Acquisition.Explicit):
+ ... def __getitem__(self, key):
+ ... print 'getitem', key
+ ... if key == 4:
+ ... raise IndexError
+ ... return key
+ ... def __contains__(self, key):
+ ... print 'contains', repr(key)
+ ... return key == 5
+ ... def __iter__(self):
+ ... print 'iterating...'
+ ... return iter((42,))
+
+ The naked class behaves like this:
+
+ >>> c = C()
+ >>> 3 in c
+ contains 3
+ False
+ >>> 5 in c
+ contains 5
+ True
+ >>> list(c)
+ iterating...
+ [42]
+
+ Let's put c in the context of i:
+
+ >>> i = Impl()
+ >>> i.c = c
+
+ Now check that __contains__ is properly used:
+
+ >>> 3 in i.c # c.__of__(i)
+ contains 3
+ False
+ >>> 5 in i.c
+ contains 5
+ True
+ >>> list(i.c)
+ iterating...
+ [42]
+
"""
More information about the Zope-Checkins
mailing list