[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