
tseaver at palladion
Jun 11, 2009, 11:10 AM
Post #1 of 4
(552 views)
Permalink
|
|
Re: SVN: Zope/branches/2.10/ backport r94905 to 2.10: Acquisition wrappers now correctly proxy `__iter__`.
|
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Andreas Zeidler wrote: > Log message for revision 94907: > backport r94905 to 2.10: Acquisition wrappers now correctly proxy `__iter__`. > > > Changed: > U Zope/branches/2.10/doc/CHANGES.txt > U Zope/branches/2.10/lib/python/Acquisition/_Acquisition.c > U Zope/branches/2.10/lib/python/Acquisition/tests.py > > -=- > Modified: Zope/branches/2.10/doc/CHANGES.txt > =================================================================== > --- Zope/branches/2.10/doc/CHANGES.txt 2009-01-21 16:25:34 UTC (rev 94906) > +++ Zope/branches/2.10/doc/CHANGES.txt 2009-01-21 16:26:38 UTC (rev 94907) > @@ -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.10/lib/python/Acquisition/_Acquisition.c > =================================================================== > --- Zope/branches/2.10/lib/python/Acquisition/_Acquisition.c 2009-01-21 16:25:34 UTC (rev 94906) > +++ Zope/branches/2.10/lib/python/Acquisition/_Acquisition.c 2009-01-21 16:26:38 UTC (rev 94907) > @@ -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,7 +83,8 @@ > 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.10/lib/python/Acquisition/tests.py > =================================================================== > --- Zope/branches/2.10/lib/python/Acquisition/tests.py 2009-01-21 16:25:34 UTC (rev 94906) > +++ Zope/branches/2.10/lib/python/Acquisition/tests.py 2009-01-21 16:26:38 UTC (rev 94907) > @@ -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] > + > """ This doctest is failing for me in an up-to-date checkout of the 2.10 branch. Andreas, can you please investigate? - ---------------------------------------------------------------------- File "/home/tseaver/projects/Zope-CVS/Zope-2.10-branch/lib/python/Acquisition/tests.py", line 1669, in Acquisition.tests.test_proxying Failed example: list(i.c) Expected: iterating... [42] Got: getitem 0 getitem 1 getitem 2 getitem 3 getitem 4 [0, 1, 2, 3] - ---------------------------------------------------------------------- File "/home/tseaver/projects/Zope-CVS/Zope-2.10-branch/lib/python/Acquisition/tests.py", line 1718, in Acquisition.tests.test_proxying Failed example: list(i.c) Expected: iterating... [42] Got: getitem 0 getitem 1 getitem 2 getitem 3 getitem 4 [0, 1, 2, 3] Tres. - -- =================================================================== Tres Seaver +1 540-429-0999 tseaver [at] palladion Palladion Software "Excellence by Design" http://palladion.com -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFKMUim+gerLs4ltQ4RAou8AKCFvW9TP1XhJkPU78AU2UTLgjmfZgCg2/xL k/F2tz/DBiHAoEjZ1zaXIXo= =pzv1 -----END PGP SIGNATURE----- _______________________________________________ Zope-Dev maillist - Zope-Dev [at] zope http://mail.zope.org/mailman/listinfo/zope-dev ** No cross posts or HTML encoding! ** (Related lists - http://mail.zope.org/mailman/listinfo/zope-announce http://mail.zope.org/mailman/listinfo/zope )
|