[pypy-svn] r58806 - in pypy/branch/2.5-merge: lib-python/modified-2.5.2/test pypy/objspace/std pypy/objspace/std/test
iko at codespeak.net
iko at codespeak.net
Wed Oct 8 13:49:07 CEST 2008
Author: iko
Date: Wed Oct 8 13:49:06 2008
New Revision: 58806
Modified:
pypy/branch/2.5-merge/lib-python/modified-2.5.2/test/test_set.py
pypy/branch/2.5-merge/pypy/objspace/std/dictmultiobject.py
pypy/branch/2.5-merge/pypy/objspace/std/dictobject.py
pypy/branch/2.5-merge/pypy/objspace/std/frozensettype.py
pypy/branch/2.5-merge/pypy/objspace/std/objspace.py
pypy/branch/2.5-merge/pypy/objspace/std/setobject.py
pypy/branch/2.5-merge/pypy/objspace/std/test/test_dictobject.py
pypy/branch/2.5-merge/pypy/objspace/std/test/test_set.py
Log:
(iko,cfbolz)
Fix various bugs in set found by std lib tests
Be more careful when raising KeyErrors to prevent
normalization from breaking on tuples
Modified: pypy/branch/2.5-merge/lib-python/modified-2.5.2/test/test_set.py
==============================================================================
--- pypy/branch/2.5-merge/lib-python/modified-2.5.2/test/test_set.py (original)
+++ pypy/branch/2.5-merge/lib-python/modified-2.5.2/test/test_set.py Wed Oct 8 13:49:06 2008
@@ -278,6 +278,7 @@
fo.close()
os.remove(test_support.TESTFN)
+ @test_support.impl_detail
def test_do_not_rehash_dict_keys(self):
n = 10
d = dict.fromkeys(map(HashCountingInt, xrange(n)))
@@ -514,6 +515,7 @@
s.__init__(self.otherword)
self.assertEqual(s, set(self.word))
+ @test_support.impl_detail
def test_singleton_empty_frozenset(self):
f = frozenset()
efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
@@ -683,8 +685,12 @@
for v in self.set:
self.assert_(v in self.values)
setiter = iter(self.set)
+
+ @test_support.impl_detail
+ def test__length_hint(self):
# note: __length_hint__ is an internal undocumented API,
# don't rely on it in your own programs
+ setiter = iter(self.set)
self.assertEqual(setiter.__length_hint__(), len(self.set))
def test_pickling(self):
Modified: pypy/branch/2.5-merge/pypy/objspace/std/dictmultiobject.py
==============================================================================
--- pypy/branch/2.5-merge/pypy/objspace/std/dictmultiobject.py (original)
+++ pypy/branch/2.5-merge/pypy/objspace/std/dictmultiobject.py Wed Oct 8 13:49:06 2008
@@ -1124,7 +1124,7 @@
if w_missing_item is not None:
return w_missing_item
- raise OperationError(space.w_KeyError, w_lookup)
+ space.raise_key_error(w_lookup)
def setitem__DictMulti_ANY_ANY(space, w_dict, w_newkey, w_newvalue):
w_dict.implementation = w_dict.implementation.setitem(w_newkey, w_newvalue)
@@ -1133,7 +1133,7 @@
try:
w_dict.implementation = w_dict.implementation.delitem(w_lookup)
except KeyError:
- raise OperationError(space.w_KeyError, w_lookup)
+ space.raise_key_error(w_lookup)
def len__DictMulti(space, w_dict):
return space.wrap(w_dict.implementation.length())
@@ -1253,7 +1253,7 @@
if len_defaults > 0:
return defaults[0]
else:
- raise OperationError(space.w_KeyError, w_key)
+ space.raise_key_error(w_key)
else:
w_dict.implementation.delitem(w_key)
return w_item
Modified: pypy/branch/2.5-merge/pypy/objspace/std/dictobject.py
==============================================================================
--- pypy/branch/2.5-merge/pypy/objspace/std/dictobject.py (original)
+++ pypy/branch/2.5-merge/pypy/objspace/std/dictobject.py Wed Oct 8 13:49:06 2008
@@ -78,7 +78,7 @@
except KeyError:
w_missing_item = w_dict.missing_method(space, w_lookup)
if w_missing_item is None:
- raise OperationError(space.w_KeyError, w_lookup)
+ space.raise_key_error(w_lookup)
else:
return w_missing_item
@@ -89,7 +89,7 @@
try:
del w_dict.content[w_lookup]
except KeyError:
- raise OperationError(space.w_KeyError, w_lookup)
+ space.raise_key_error(w_lookup)
def len__Dict(space, w_dict):
return space.wrap(len(w_dict.content))
Modified: pypy/branch/2.5-merge/pypy/objspace/std/frozensettype.py
==============================================================================
--- pypy/branch/2.5-merge/pypy/objspace/std/frozensettype.py (original)
+++ pypy/branch/2.5-merge/pypy/objspace/std/frozensettype.py Wed Oct 8 13:49:06 2008
@@ -40,7 +40,8 @@
def descr__frozenset__new__(space, w_frozensettype, w_iterable=NoneNotWrapped):
from pypy.objspace.std.setobject import W_FrozensetObject
from pypy.objspace.std.setobject import _is_frozenset_exact
- if _is_frozenset_exact(w_iterable):
+ if (space.is_w(w_frozensettype, space.w_frozenset) and
+ _is_frozenset_exact(w_iterable)):
return w_iterable
w_obj = space.allocate_instance(W_FrozensetObject, w_frozensettype)
W_FrozensetObject.__init__(w_obj, space, None)
Modified: pypy/branch/2.5-merge/pypy/objspace/std/objspace.py
==============================================================================
--- pypy/branch/2.5-merge/pypy/objspace/std/objspace.py (original)
+++ pypy/branch/2.5-merge/pypy/objspace/std/objspace.py Wed Oct 8 13:49:06 2008
@@ -791,6 +791,10 @@
else:
ObjSpace.delslice(self, w_obj, w_start, w_stop)
+ def raise_key_error(self, w_key):
+ e = self.call_function(self.w_KeyError, w_key)
+ raise OperationError(self.w_KeyError, e)
+
class MM:
"Container for multimethods."
call = StdObjSpaceMultiMethod('call', 1, ['__call__'], general__args__=True)
Modified: pypy/branch/2.5-merge/pypy/objspace/std/setobject.py
==============================================================================
--- pypy/branch/2.5-merge/pypy/objspace/std/setobject.py (original)
+++ pypy/branch/2.5-merge/pypy/objspace/std/setobject.py Wed Oct 8 13:49:06 2008
@@ -313,14 +313,11 @@
try:
return space.newbool(w_other in w_left.setdata)
except OperationError, e:
- if not e.match(space, space.w_TypeError):
- raise
-
- w_f = _convert_set_to_frozenset(space, w_other)
- if w_f is not None:
- return space.newbool(w_f in w_left.setdata)
- else:
- return space.w_False
+ if e.match(space, space.w_TypeError):
+ w_f = _convert_set_to_frozenset(space, w_other)
+ if w_f is not None:
+ return space.newbool(w_f in w_left.setdata)
+ raise
contains__Frozenset_ANY = contains__Set_ANY
@@ -437,10 +434,10 @@
except OperationError, e:
if not e.match(space, space.w_TypeError):
raise
+ w_f = _convert_set_to_frozenset(space, w_item)
+ if w_f is None:
+ raise
- w_f = _convert_set_to_frozenset(space, w_item)
- if w_f is None:
- return w_item
try:
del w_left.setdata[w_f]
return None
@@ -457,7 +454,7 @@
def set_remove__Set_ANY(space, w_left, w_item):
w_f = _discard_from_set(space, w_left, w_item)
if w_f is not None:
- raise OperationError(space.w_KeyError, w_f)
+ space.raise_key_error(w_f)
def hash__Frozenset(space, w_set):
multi = r_uint(1822399083) + r_uint(1822399083) + 1
@@ -633,7 +630,7 @@
'The app-level part of repr().'
set_id = id(s)
if set_id in currently_in_repr:
- return 'set(...)'
+ return '%s(...)' % (s.__class__.__name__,)
currently_in_repr[set_id] = 1
try:
return '%s(%s)' % (s.__class__.__name__, [x for x in s])
@@ -653,6 +650,8 @@
w_currently_in_repr = ec._py_repr = space.newdict()
return setrepr(space, w_currently_in_repr, w_set)
+repr__Frozenset = repr__Set
+
app = gateway.applevel("""
def reduce__Set(s):
dict = getattr(s,'__dict__', None)
@@ -660,8 +659,6 @@
""", filename=__file__)
-repr__Frozenset = app.interphook('repr__Set')
-
set_reduce__Set = app.interphook('reduce__Set')
frozenset_reduce__Frozenset = app.interphook('reduce__Set')
Modified: pypy/branch/2.5-merge/pypy/objspace/std/test/test_dictobject.py
==============================================================================
--- pypy/branch/2.5-merge/pypy/objspace/std/test/test_dictobject.py (original)
+++ pypy/branch/2.5-merge/pypy/objspace/std/test/test_dictobject.py Wed Oct 8 13:49:06 2008
@@ -417,6 +417,39 @@
d1.update(d2)
assert d1['a'] == 42 # fails on CPython, d1['a'] == 'foo'
+ def test_index_keyerror_unpacking(self):
+ d = {}
+ for v1 in ['Q', (1,)]:
+ try:
+ d[v1]
+ except KeyError, e:
+ v2 = e.args[0]
+ assert v1 == v2
+ else:
+ assert False, 'Expected KeyError'
+
+ def test_del_keyerror_unpacking(self):
+ d = {}
+ for v1 in ['Q', (1,)]:
+ try:
+ del d[v1]
+ except KeyError, e:
+ v2 = e.args[0]
+ assert v1 == v2
+ else:
+ assert False, 'Expected KeyError'
+
+ def test_pop_keyerror_unpacking(self):
+ d = {}
+ for v1 in ['Q', (1,)]:
+ try:
+ d.pop(v1)
+ except KeyError, e:
+ v2 = e.args[0]
+ assert v1 == v2
+ else:
+ assert False, 'Expected KeyError'
+
# the minimal 'space' needed to use a W_DictObject
class FakeSpace:
Modified: pypy/branch/2.5-merge/pypy/objspace/std/test/test_set.py
==============================================================================
--- pypy/branch/2.5-merge/pypy/objspace/std/test/test_set.py (original)
+++ pypy/branch/2.5-merge/pypy/objspace/std/test/test_set.py Wed Oct 8 13:49:06 2008
@@ -83,6 +83,15 @@
s.add(A(s))
assert repr(s) == "set([1, 2, 3, set(...)])"
+ def test_recursive_repr_frozenset(self):
+ class A(object):
+ def __repr__(self):
+ return repr(self.s)
+ a = A()
+ s = frozenset([1, 2, 3, a])
+ a.s = s
+ assert repr(s) == "frozenset([1, 2, 3, frozenset(...)])"
+
def test_keyerror_has_key(self):
s = set()
try:
@@ -143,3 +152,44 @@
except KeyError, e:
assert isinstance(e.args[0], frozenset)
assert e.args[0] == frozenset([2, 3])
+
+ def test_contains(self):
+ letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
+ word = 'teleledningsanka'
+ s = set(word)
+ for c in letters:
+ assert (c in s) == (c in word)
+ raises(TypeError, s.__contains__, [])
+
+ def test_remove(self):
+ s = set('abc')
+ s.remove('a')
+ assert 'a' not in s
+ raises(KeyError, s.remove, 'a')
+ raises(TypeError, s.remove, [])
+ s.add(frozenset('def'))
+ assert set('def') in s
+ s.remove(set('def'))
+ assert set('def') not in s
+ raises(KeyError, s.remove, set('def'))
+
+ def test_remove_keyerror_unpacking(self):
+ # bug: www.python.org/sf/1576657
+ s = set()
+ for v1 in ['Q', (1,)]:
+ try:
+ s.remove(v1)
+ except KeyError, e:
+ v2 = e.args[0]
+ assert v1 == v2
+ else:
+ assert False, 'Expected KeyError'
+
+ def test_singleton_empty_frozenset(self):
+ class Frozenset(frozenset):
+ pass
+ f = frozenset()
+ F = Frozenset()
+ efs = [f, Frozenset(f)]
+ # All empty frozenset subclass instances should have different ids
+ assert len(set(map(id, efs))) == len(efs)
More information about the Pypy-commit
mailing list