[Zope-dev] SVN: Zope/branches/2.10/ backport r94905 to 2.10: Acquisition wrappers now correctly proxy `__iter__`.

Tres Seaver tseaver at palladion.com
Thu Jun 11 14:10:46 EDT 2009


-----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.com
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-----



More information about the Zope-Dev mailing list