Stephan Richter wrote:
Hi everyone,
I am starting to use Restricted Python a lot and I found the following problem
with slicing:
from zope.security import checker
l = [1, 2]
l[-3:]
[1, 2]
lp = checker.ProxyFactory(l)
lp[-3:]
[2]
The problem is that -3 gets converted to 1 somewhere, but it should be a
negative number signalizing the slice to start at the beginning of the
sequence.
The problem exists both in Python 2.4 and 2.5 and affects both Zope 2 and 3,
since both Zopes use the RestrictedPython package.
I suspect that the problem lies with the new slicing syntax introduced in
Python 2.4. I am willing to fix the bug, but I would need some guidance and
goodwill from the gods of RestrictedPython. Anyone?
Are you in fact using RestrictedPython? The code snippet looks like it
only uses a security proxy. RestrictedPython is a custom Python
compiler; you're not using it unless your interactive Python prompt uses
RestrictedPython to compile all expressions.
The behavior you saw is exactly what happens when an object implements
__getitem__ and __len__ but not __getslice__. If lp matches that
description, and the length of lp is 2, then Python evaluates "lp[-3:]"
as "lp.__getitem__(slice(-1, 2147483647, None))". I wish Python would
instead evaluate it as "lp.__getitem__(slice(-3))", but maybe there are
historical reasons for this.
OTOH, if RestrictedPython really is involved, RP will convert the
expression to "_getitem_(lp, slice(-3, None))", which would probably do
what you wanted, assuming the _getitem_ function is not too clever.
BTW, here's the code I used to answer this email. :-)
>>> class itemgetter:
... def __getitem__(self, i):
... return i
... def __len__(self):
... return 2
...
>>> itemgetter()[-3:]
slice(-1, 2147483647, None)
Shane
_______________________________________________
Zope-Dev maillist - Zope-Dev@zope.org
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 )