[pypy-commit] pypy py3k: implement isdisjoint for keys/items dict views

antocuni noreply at buildbot.pypy.org
Thu Oct 18 18:08:04 CEST 2012


Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: py3k
Changeset: r58226:68abca2a460f
Date: 2012-10-18 18:07 +0200
http://bitbucket.org/pypy/pypy/changeset/68abca2a460f/

Log:	implement isdisjoint for keys/items dict views

diff --git a/pypy/objspace/std/dictmultiobject.py b/pypy/objspace/std/dictmultiobject.py
--- a/pypy/objspace/std/dictmultiobject.py
+++ b/pypy/objspace/std/dictmultiobject.py
@@ -1052,7 +1052,6 @@
 
 generate_setops()
 
-
 # ____________________________________________________________
 
 from pypy.objspace.std import dicttype
diff --git a/pypy/objspace/std/dicttype.py b/pypy/objspace/std/dicttype.py
--- a/pypy/objspace/std/dicttype.py
+++ b/pypy/objspace/std/dicttype.py
@@ -42,6 +42,7 @@
                       doc='D.itervalues() -> an iterator over the values of D')
 dict_reversed   = SMM('__reversed__',      1)
 
+
 def dict_reversed__ANY(space, w_dict):
     raise OperationError(space.w_TypeError, space.wrap('argument to reversed() must be a sequence'))
 
@@ -192,12 +193,42 @@
 # ____________________________________________________________
 # Dict views
 
+def descr_dictview_isdisjoin(space, w_self, w_other):
+    from pypy.objspace.std.dictmultiobject import W_DictViewObject
+    if w_self is w_other:
+        if space.len_w(w_self) == 0:
+            return space.w_True
+        else:
+            return space.w_False
+
+    # check whether w_other is a set-like object
+    if (space.isinstance_w(w_other, space.w_set) or
+        space.isinstance_w(w_other, space.w_frozenset) or
+        isinstance(w_other, W_DictViewObject)):
+        # if w_other is set-like and it's longer, we iterate over w_self
+        # instead
+        len_self = space.len_w(w_self)
+        len_other = space.len_w(w_other)
+        if len_other > len_self:
+            w_self, w_other = w_other, w_self
+
+    w_it = space.iter(w_other)
+    for w_item in space.iteriterable(w_it):
+        if space.is_true(space.contains(w_self, w_item)):
+            return space.w_False
+    return space.w_True
+
+
 dict_keys_typedef = StdTypeDef(
     "dict_keys",
+    isdisjoint = gateway.interp2app(descr_dictview_isdisjoin),
+
     )
+dict_keys_typedef.registermethods(globals())
 
 dict_items_typedef = StdTypeDef(
     "dict_items",
+    isdisjoint = gateway.interp2app(descr_dictview_isdisjoin),
     )
 
 dict_values_typedef = StdTypeDef(
diff --git a/pypy/objspace/std/test/test_dictmultiobject.py b/pypy/objspace/std/test/test_dictmultiobject.py
--- a/pypy/objspace/std/test/test_dictmultiobject.py
+++ b/pypy/objspace/std/test/test_dictmultiobject.py
@@ -752,6 +752,26 @@
         assert d1.keys() - set(d2.keys()) == set('a')
         assert d1.keys() - set(d3.keys()) == set('ab')
 
+        assert not d1.keys().isdisjoint(d1.keys())
+        assert not d1.keys().isdisjoint(d2.keys())
+        assert not d1.keys().isdisjoint(list(d2.keys()))
+        assert not d1.keys().isdisjoint(set(d2.keys()))
+        
+        assert d1.keys().isdisjoint({'x', 'y', 'z'})
+        assert d1.keys().isdisjoint(['x', 'y', 'z'])
+        assert d1.keys().isdisjoint(set(['x', 'y', 'z']))
+        assert d1.keys().isdisjoint(set(['x', 'y']))
+        assert d1.keys().isdisjoint(['x', 'y'])
+        assert d1.keys().isdisjoint({})
+        assert d1.keys().isdisjoint(d3.keys())
+
+        de = {}
+        assert de.keys().isdisjoint(set())
+        assert de.keys().isdisjoint([])
+        assert de.keys().isdisjoint(de.keys())
+        assert de.keys().isdisjoint([1])
+
+
     def test_items_set_operations(self):
         d1 = {'a': 1, 'b': 2}
         d2 = {'a': 2, 'b': 2}
@@ -784,6 +804,23 @@
         assert d1.items() - d2.items() == set([('a', 1)])
         assert d1.items() - d3.items() == set([('a', 1), ('b', 2)])
 
+        assert not d1.items().isdisjoint(d1.items())
+        assert not d1.items().isdisjoint(d2.items())
+        assert not d1.items().isdisjoint(list(d2.items()))
+        assert not d1.items().isdisjoint(set(d2.items()))
+        assert d1.items().isdisjoint({'x', 'y', 'z'})
+        assert d1.items().isdisjoint(['x', 'y', 'z'])
+        assert d1.items().isdisjoint(set(['x', 'y', 'z']))
+        assert d1.items().isdisjoint(set(['x', 'y']))
+        assert d1.items().isdisjoint({})
+        assert d1.items().isdisjoint(d3.items())
+
+        de = {}
+        assert de.items().isdisjoint(set())
+        assert de.items().isdisjoint([])
+        assert de.items().isdisjoint(de.items())
+        assert de.items().isdisjoint([1])
+
     def test_keys_set_operations_any_type(self):
         d = {1: 'a', 2: 'b', 3: 'c'}
         assert d.keys() & {1} == {1}


More information about the pypy-commit mailing list