[Zope-dev] Fwd: Multi-argument append() is illegal

Tres Seaver tseaver@palladion.com
Fri, 03 Mar 2000 12:39:15 -0600


Martijn Pieters <mj@digicool.com>
> 
> From: "Patrick Phalen" <zope@teleo.net>
> > Fredrik Lundh has mentioned that this breaks Zope (and Medusa).
> >
> > If so, it's probably not too soon to begin looking into it. 1.6 is due
> > this summer.
> >
> >

<Guido's message snipped>

> 
> Using a more advanced pattern (one that weeds out most proper appends, and
> takes multiple lines into account), plus some hand weeding, brings up the
> following list of 'illegal' tuple appends:
> 
> lib\python\ExportImportXML.py(109):
>     self._tindex.append(self._oid, here)
> lib\python\Shared\DC\ZRDB\RDB.py(199):
>     parsers.append(i,parser)
> lib\python\Shared\DC\xml\ppml.py(278):
>     def __setitem__(self, k, v): self._d.append(k,v)
> lib\python\ZODB\FileStorage.py(633):
>     self._tappend(oid, here)
> lib\python\ZPublisher\cgi.py(603):
>     r.append(name, value)
> utilities\FS.py(145):
>     self._tappend(oid, here)
> ZServer\HTTPServer.py(285):
>     request.channel.queue.append(self.module_name, zrequest, zresponse)
> ZServer\medusa\asyncore.py(84):
>     l.append (fd, flags)
> 
> Above 8 occurences are all cases of tuples being appended to a list, using
> the 'illegal' style syntax. Note that I still may have missed occurences,
> and that Python 1.6 might break other things. The change from 1.5.1 to 1.5.2
> broke certain things in Zope as well, usually because of library changes.
> 
> For those of you that grok POSIX regexp, here is what I used to search these
> out:
> 
>   append[[:blank:]]*\(([^[{(,]|[[:space:]])+,
> 
> where [:blank:] stands for whitespace (not including newlines), and
> [:space:] is whitespace (including newline). This will miss aliasing of
> .append (app=list.append), which I hunted out with a separate regexp, and
> lines like:
> 
>   append(1 # number 1
>          ,2 # number 2
> 
> which were again hunted (and none found) with another simple regexp. So I am
> fairly sure I got em all =).
> 
> I have posted these to the Collector.

The other thing to look out for is the "extra layer of indirection", where
append is invoked through another name.  For example::

  >>> foobar = []
  >>> push = foobar.append
  >>> push( 'foo', 'bar' )
  >>> foobar
  [('foo', 'bar')]

This gets especially ugly if the bound method is passed as a "normal" function
pointer into some completely different scope, which might invoke it with
arbitrary parameters.

Tres.
-- 
=========================================================
Tres Seaver         tseaver@palladion.com    713-523-6582
Palladion Software  http://www.palladion.com