[pypy-svn] r79379 - in pypy/branch/fast-forward/pypy/objspace/std: . test
afa at codespeak.net
afa at codespeak.net
Tue Nov 23 01:18:47 CET 2010
Author: afa
Date: Tue Nov 23 01:18:46 2010
New Revision: 79379
Modified:
pypy/branch/fast-forward/pypy/objspace/std/dictmultiobject.py
pypy/branch/fast-forward/pypy/objspace/std/dicttype.py
pypy/branch/fast-forward/pypy/objspace/std/model.py
pypy/branch/fast-forward/pypy/objspace/std/test/test_dictmultiobject.py
Log:
More progress on dictviews
Modified: pypy/branch/fast-forward/pypy/objspace/std/dictmultiobject.py
==============================================================================
--- pypy/branch/fast-forward/pypy/objspace/std/dictmultiobject.py (original)
+++ pypy/branch/fast-forward/pypy/objspace/std/dictmultiobject.py Tue Nov 23 01:18:46 2010
@@ -7,6 +7,7 @@
from pypy.module.__builtin__.__init__ import BUILTIN_TO_INDEX, OPTIMIZED_BUILTINS
from pypy.rlib.objectmodel import r_dict, we_are_translated
+from pypy.objspace.std.settype import set_typedef as settypedef
def _is_str(space, w_key):
return space.is_w(space.type(w_key), space.w_str)
@@ -757,13 +758,13 @@
return W_DictMultiIterObject(space, w_self.iter(), VALUESITER)
def dict_viewitems__DictMulti(space, w_self):
- return W_DictMultiViewItemsObject(space, w_self)
+ return W_DictViewItemsObject(space, w_self)
def dict_viewkeys__DictMulti(space, w_self):
- return W_DictMultiViewKeysObject(space, w_self)
+ return W_DictViewKeysObject(space, w_self)
def dict_viewvalues__DictMulti(space, w_self):
- return W_DictMultiViewValuesObject(space, w_self)
+ return W_DictViewValuesObject(space, w_self)
def dict_clear__DictMulti(space, w_self):
w_self.clear()
@@ -889,21 +890,62 @@
def __init__(w_self, space, w_dict):
w_self.w_dict = w_dict
-class W_DictMultiViewKeysObject(W_DictViewObject):
+class W_DictViewKeysObject(W_DictViewObject):
from pypy.objspace.std.dicttype import dict_keys_typedef as typedef
-registerimplementation(W_DictMultiViewKeysObject)
+registerimplementation(W_DictViewKeysObject)
-class W_DictMultiViewItemsObject(W_DictViewObject):
+class W_DictViewItemsObject(W_DictViewObject):
from pypy.objspace.std.dicttype import dict_items_typedef as typedef
-registerimplementation(W_DictMultiViewItemsObject)
+registerimplementation(W_DictViewItemsObject)
-class W_DictMultiViewValuesObject(W_DictViewObject):
+class W_DictViewValuesObject(W_DictViewObject):
from pypy.objspace.std.dicttype import dict_values_typedef as typedef
-registerimplementation(W_DictMultiViewValuesObject)
+registerimplementation(W_DictViewValuesObject)
-def len__DictMultiViewKeys(space, w_dictview):
+def len__DictViewKeys(space, w_dictview):
return space.len(w_dictview.w_dict)
-len__DictMultiViewItems = len__DictMultiViewValues = len__DictMultiViewKeys
+len__DictViewItems = len__DictViewValues = len__DictViewKeys
+
+def iter__DictViewKeys(space, w_dictview):
+ return dict_iterkeys__DictMulti(space, w_dictview.w_dict)
+def iter__DictViewItems(space, w_dictview):
+ return dict_iteritems__DictMulti(space, w_dictview.w_dict)
+def iter__DictViewValues(space, w_dictview):
+ return dict_itervalues__DictMulti(space, w_dictview.w_dict)
+
+def all_contained_in(space, w_dictview, w_otherview):
+ w_iter = space.iter(w_dictview)
+ assert isinstance(w_iter, W_DictMultiIterObject)
+
+ while True:
+ try:
+ w_item = space.next(w_iter)
+ except OperationError, e:
+ if not e.match(space, space.w_StopIteration):
+ raise
+ break
+ if not space.is_true(space.contains(w_otherview, w_item)):
+ return space.w_False
+
+ return space.w_True
+
+def eq__DictViewKeys_DictViewKeys(space, w_dictview, w_otherview):
+ if space.eq_w(space.len(w_dictview), space.len(w_otherview)):
+ return all_contained_in(space, w_dictview, w_otherview)
+ return space.w_False
+eq__DictViewKeys_settypedef = eq__DictViewKeys_DictViewKeys
+
+eq__DictViewKeys_DictViewItems = eq__DictViewKeys_DictViewKeys
+eq__DictViewItems_DictViewItems = eq__DictViewKeys_DictViewKeys
+eq__DictViewItems_settypedef = eq__DictViewItems_DictViewItems
+
+def repr__DictViewKeys(space, w_dictview):
+ w_seq = space.call_function(space.w_list, w_dictview)
+ w_repr = space.repr(w_seq)
+ return space.wrap("%s(%s)" % (space.type(w_dictview).getname(space, "?"),
+ space.str_w(w_repr)))
+repr__DictViewItems = repr__DictViewKeys
+repr__DictViewValues = repr__DictViewKeys
# ____________________________________________________________
Modified: pypy/branch/fast-forward/pypy/objspace/std/dicttype.py
==============================================================================
--- pypy/branch/fast-forward/pypy/objspace/std/dicttype.py (original)
+++ pypy/branch/fast-forward/pypy/objspace/std/dicttype.py Tue Nov 23 01:18:46 2010
@@ -170,25 +170,14 @@
# ____________________________________________________________
# Dict views
-
- at gateway.unwrap_spec(gateway.ObjSpace, gateway.W_Root, gateway.W_Root)
-def descr_view__new__(space, w_viewtype, w_dict):
- from pypy.objspace.std.dictmultiobject import W_DictView
- w_obj = space.allocate_instance(W_DictView, w_viewtype)
- w_obj.__init__(space, w_dict)
- return w_obj
-
dict_keys_typedef = StdTypeDef(
"dict_keys",
- __new__ = descr_view__new__,
)
dict_items_typedef = StdTypeDef(
"dict_items",
- __new__ = descr_view__new__,
)
dict_values_typedef = StdTypeDef(
"dict_values",
- __new__ = descr_view__new__,
)
Modified: pypy/branch/fast-forward/pypy/objspace/std/model.py
==============================================================================
--- pypy/branch/fast-forward/pypy/objspace/std/model.py (original)
+++ pypy/branch/fast-forward/pypy/objspace/std/model.py Tue Nov 23 01:18:46 2010
@@ -122,9 +122,9 @@
iterobject.W_ReverseSeqIterObject: [],
unicodeobject.W_UnicodeObject: [],
dictproxyobject.W_DictProxyObject: [],
- dictmultiobject.W_DictMultiViewKeysObject: [],
- dictmultiobject.W_DictMultiViewItemsObject: [],
- dictmultiobject.W_DictMultiViewValuesObject: [],
+ dictmultiobject.W_DictViewKeysObject: [],
+ dictmultiobject.W_DictViewItemsObject: [],
+ dictmultiobject.W_DictViewValuesObject: [],
pypy.interpreter.pycode.PyCode: [],
pypy.interpreter.special.Ellipsis: [],
}
Modified: pypy/branch/fast-forward/pypy/objspace/std/test/test_dictmultiobject.py
==============================================================================
--- pypy/branch/fast-forward/pypy/objspace/std/test/test_dictmultiobject.py (original)
+++ pypy/branch/fast-forward/pypy/objspace/std/test/test_dictmultiobject.py Tue Nov 23 01:18:46 2010
@@ -500,13 +500,6 @@
iterable = {}
raises(TypeError, len, iter(iterable))
- def test_dictview(self):
- d = {1: 2, 3: 4}
- assert len(d.viewkeys()) == 2
- assert len(d.viewitems()) == 2
- assert len(d.viewvalues()) == 2
-
-
class AppTest_DictMultiObject(AppTest_DictObject):
def test_emptydict_unhashable(self):
@@ -526,6 +519,148 @@
assert type(key) is str
assert getattr(a, s) == 42
+class AppTestDictViews:
+ def test_dictview(self):
+ d = {1: 2, 3: 4}
+ assert len(d.viewkeys()) == 2
+ assert len(d.viewitems()) == 2
+ assert len(d.viewvalues()) == 2
+
+ def test_constructors_not_callable(self):
+ kt = type({}.viewkeys())
+ raises(TypeError, kt, {})
+ raises(TypeError, kt)
+ it = type({}.viewitems())
+ raises(TypeError, it, {})
+ raises(TypeError, it)
+ vt = type({}.viewvalues())
+ raises(TypeError, vt, {})
+ raises(TypeError, vt)
+
+ def test_dict_keys(self):
+ d = {1: 10, "a": "ABC"}
+ keys = d.viewkeys()
+ assert len(keys) == 2
+ assert set(keys) == set([1, "a"])
+ assert keys == set([1, "a"])
+ assert keys != set([1, "a", "b"])
+ assert keys != set([1, "b"])
+ assert keys != set([1])
+ assert keys != 42
+ assert 1 in keys
+ assert "a" in keys
+ assert 10 not in keys
+ assert "Z" not in keys
+ assert d.viewkeys() == d.viewkeys()
+ e = {1: 11, "a": "def"}
+ assert d.viewkeys() == e.viewkeys()
+ del e["a"]
+ assert d.viewkeys() != e.viewkeys()
+
+ def test_dict_items(self):
+ d = {1: 10, "a": "ABC"}
+ items = d.viewitems()
+ assert len(items) == 2
+ assert set(items) == set([(1, 10), ("a", "ABC")])
+ assert items == set([(1, 10), ("a", "ABC")])
+ assert items != set([(1, 10), ("a", "ABC"), "junk"])
+ assert items != set([(1, 10), ("a", "def")])
+ assert items != set([(1, 10)])
+ assert items != 42
+ assert (1, 10) in items
+ assert ("a", "ABC") in items
+ assert (1, 11) not in items
+ assert 1 not in items
+ assert () not in items
+ assert (1,) not in items
+ assert (1, 2, 3) not in items
+ assert d.viewitems() == d.viewitems()
+ e = d.copy()
+ assert d.viewitems() == e.viewitems()
+ e["a"] = "def"
+ assert d.viewitems() != e.viewitems()
+
+ def test_dict_mixed_keys_items(self):
+ d = {(1, 1): 11, (2, 2): 22}
+ e = {1: 1, 2: 2}
+ assert d.viewkeys() == e.viewitems()
+ assert d.viewitems() != e.viewkeys()
+
+ def test_dict_values(self):
+ d = {1: 10, "a": "ABC"}
+ values = d.viewvalues()
+ assert set(values) == set([10, "ABC"])
+ assert len(values) == 2
+
+ def test_dict_repr(self):
+ d = {1: 10, "a": "ABC"}
+ assert isinstance(repr(d), str)
+ r = repr(d.viewitems())
+ assert isinstance(r, str)
+ assert (r == "dict_items([('a', 'ABC'), (1, 10)])" or
+ r == "dict_items([(1, 10), ('a', 'ABC')])")
+ r = repr(d.viewkeys())
+ assert isinstance(r, str)
+ assert (r == "dict_keys(['a', 1])" or
+ r == "dict_keys([1, 'a'])")
+ r = repr(d.viewvalues())
+ assert isinstance(r, str)
+ assert (r == "dict_values(['ABC', 10])" or
+ r == "dict_values([10, 'ABC'])")
+
+ def test_keys_set_operations(self):
+ d1 = {'a': 1, 'b': 2}
+ d2 = {'b': 3, 'c': 2}
+ d3 = {'d': 4, 'e': 5}
+ assert d1.viewkeys() & d1.viewkeys() == {'a', 'b'}
+ assert d1.viewkeys() & d2.viewkeys() == {'b'}
+ assert d1.viewkeys() & d3.viewkeys() == set()
+ assert d1.viewkeys() & set(d1.viewkeys()) == {'a', 'b'}
+ assert d1.viewkeys() & set(d2.viewkeys()) == {'b'}
+ assert d1.viewkeys() & set(d3.viewkeys()) == set()
+
+ assert d1.viewkeys() | d1.viewkeys() == {'a', 'b'}
+ assert d1.viewkeys() | d2.viewkeys() == {'a', 'b', 'c'}
+ assert d1.viewkeys() | d3.viewkeys() == {'a', 'b', 'd', 'e'}
+ assert d1.viewkeys() | set(d1.viewkeys()) == {'a', 'b'}
+ assert d1.viewkeys() | set(d2.viewkeys()) == {'a', 'b', 'c'}
+ assert d1.viewkeys() | set(d3.viewkeys()) == {'a', 'b', 'd', 'e'}
+
+ assert d1.viewkeys() ^ d1.viewkeys() == set()
+ assert d1.viewkeys() ^ d2.viewkeys() == {'a', 'c'}
+ assert d1.viewkeys() ^ d3.viewkeys() == {'a', 'b', 'd', 'e'}
+ assert d1.viewkeys() ^ set(d1.viewkeys()) == set()
+ assert d1.viewkeys() ^ set(d2.viewkeys()) == {'a', 'c'}
+ assert d1.viewkeys() ^ set(d3.viewkeys()) == {'a', 'b', 'd', 'e'}
+
+ def test_items_set_operations(self):
+ d1 = {'a': 1, 'b': 2}
+ d2 = {'a': 2, 'b': 2}
+ d3 = {'d': 4, 'e': 5}
+ assert d1.viewitems() & d1.viewitems() == {('a', 1), ('b', 2)}
+ assert d1.viewitems() & d2.viewitems() == {('b', 2)}
+ assert d1.viewitems() & d3.viewitems() == set()
+ assert d1.viewitems() & set(d1.viewitems()) == {('a', 1), ('b', 2)}
+ assert d1.viewitems() & set(d2.viewitems()) == {('b', 2)}
+ assert d1.viewitems() & set(d3.viewitems()) == set()
+
+ assert d1.viewitems() | d1.viewitems() == {('a', 1), ('b', 2)}
+ assert (d1.viewitems() | d2.viewitems() ==
+ {('a', 1), ('a', 2), ('b', 2)})
+ assert (d1.viewitems() | d3.viewitems() ==
+ {('a', 1), ('b', 2), ('d', 4), ('e', 5)})
+ assert (d1.viewitems() | set(d1.viewitems()) ==
+ {('a', 1), ('b', 2)})
+ assert (d1.viewitems() | set(d2.viewitems()) ==
+ {('a', 1), ('a', 2), ('b', 2)})
+ assert (d1.viewitems() | set(d3.viewitems()) ==
+ {('a', 1), ('b', 2), ('d', 4), ('e', 5)})
+
+ assert d1.viewitems() ^ d1.viewitems() == set()
+ assert d1.viewitems() ^ d2.viewitems() == {('a', 1), ('a', 2)}
+ assert (d1.viewitems() ^ d3.viewitems() ==
+ {('a', 1), ('b', 2), ('d', 4), ('e', 5)})
+
class AppTestModuleDict(object):
def setup_class(cls):
More information about the Pypy-commit
mailing list