[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