Author: Ronan Lamy <[email protected]>
Branch: py3.5
Changeset: r95729:eb0bd5f16264
Date: 2019-01-26 01:50 +0000
http://bitbucket.org/pypy/pypy/changeset/eb0bd5f16264/

Log:    Avoid importing from the stdlib at translation time.

        Makes dict_items, dict_keys, and dict_values instantiable and
        subclassable.

diff --git a/lib_pypy/_pypy_collections.py b/lib_pypy/_pypy_collections.py
--- a/lib_pypy/_pypy_collections.py
+++ b/lib_pypy/_pypy_collections.py
@@ -1,6 +1,5 @@
 from __pypy__ import reversed_dict, move_to_end, objects_in_repr
 from _operator import eq as _eq
-import _collections_abc
 
 
 class OrderedDict(dict):
@@ -29,7 +28,33 @@
             raise TypeError('expected at most 1 arguments, got %d' % len(args))
         self.__update(*args, **kwds)
 
-    update = __update = _collections_abc.MutableMapping.update
+    def update(*args, **kwds):
+        ''' D.update([E, ]**F) -> None.  Update D from mapping/iterable E and 
F.
+            If E present and has a .keys() method, does:     for k in E: D[k] 
= E[k]
+            If E present and lacks .keys() method, does:     for (k, v) in E: 
D[k] = v
+            In either case, this is followed by: for k, v in F.items(): D[k] = 
v
+        '''
+        if not args:
+            raise TypeError("descriptor 'update' of 'OrderedDict' object "
+                            "needs an argument")
+        self, *args = args
+        if len(args) > 1:
+            raise TypeError('update expected at most 1 arguments, got %d' %
+                            len(args))
+        if args:
+            other = args[0]
+            if hasattr(other, 'items'):
+                for key, value in other.items():
+                    self[key] = value
+            elif hasattr(other, "keys"):
+                for key in other.keys():
+                    self[key] = other[key]
+            else:
+                for key, value in other:
+                    self[key] = value
+        for key, value in kwds.items():
+            self[key] = value
+    __update = update
 
     def __reversed__(self):
         return reversed_dict(self)
@@ -106,17 +131,20 @@
         "D.values() -> an object providing a view on D's values"
         return _OrderedDictValuesView(self)
 
+dict_keys = type({}.keys())
+dict_values = type({}.values())
+dict_items = type({}.items())
 
-class _OrderedDictKeysView(_collections_abc.KeysView):
+class _OrderedDictKeysView(dict_keys):
     def __reversed__(self):
         yield from reversed_dict(self._mapping)
 
-class _OrderedDictItemsView(_collections_abc.ItemsView):
+class _OrderedDictItemsView(dict_items):
     def __reversed__(self):
         for key in reversed_dict(self._mapping):
             yield (key, self._mapping[key])
 
-class _OrderedDictValuesView(_collections_abc.ValuesView):
+class _OrderedDictValuesView(dict_values):
     def __reversed__(self):
         for key in reversed_dict(self._mapping):
             yield self._mapping[key]
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
@@ -1538,6 +1538,12 @@
     descr_or, descr_ror = _as_set_op('or', 'update')
     descr_xor, descr_rxor = _as_set_op('xor', 'symmetric_difference_update')
 
+def new_dict_items(space, w_type, w_dict):
+    w_dict = space.interp_w(W_DictMultiObject, w_dict)
+    w_obj = space.allocate_instance(W_DictViewItemsObject, w_type)
+    W_DictViewObject.__init__(w_obj, space, w_dict)
+    return w_obj
+
 class W_DictViewItemsObject(W_DictViewObject, SetLikeDictView):
     def descr_iter(self, space):
         return W_DictMultiIterItemsObject(space, self.w_dict.iteritems())
@@ -1557,18 +1563,32 @@
             return space.w_False
         return space.newbool(space.eq_w(w_value, w_found))
 
+def new_dict_keys(space, w_type, w_dict):
+    w_dict = space.interp_w(W_DictMultiObject, w_dict)
+    w_obj = space.allocate_instance(W_DictViewKeysObject, w_type)
+    W_DictViewObject.__init__(w_obj, space, w_dict)
+    return w_obj
+
 class W_DictViewKeysObject(W_DictViewObject, SetLikeDictView):
     def descr_iter(self, space):
         return W_DictMultiIterKeysObject(space, self.w_dict.iterkeys())
+
     def descr_contains(self, space, w_key):
         return self.w_dict.descr_contains(space, w_key)
 
+def new_dict_values(space, w_type, w_dict):
+    w_dict = space.interp_w(W_DictMultiObject, w_dict)
+    w_obj = space.allocate_instance(W_DictViewValuesObject, w_type)
+    W_DictViewObject.__init__(w_obj, space, w_dict)
+    return w_obj
+
 class W_DictViewValuesObject(W_DictViewObject):
     def descr_iter(self, space):
         return W_DictMultiIterValuesObject(space, self.w_dict.itervalues())
 
 W_DictViewItemsObject.typedef = TypeDef(
     "dict_items",
+    __new__ = interp2app(new_dict_items),
     __repr__ = interp2app(W_DictViewItemsObject.descr_repr),
     __len__ = interp2app(W_DictViewItemsObject.descr_len),
     __iter__ = interp2app(W_DictViewItemsObject.descr_iter),
@@ -1594,6 +1614,7 @@
 
 W_DictViewKeysObject.typedef = TypeDef(
     "dict_keys",
+    __new__ = interp2app(new_dict_keys),
     __repr__ = interp2app(W_DictViewKeysObject.descr_repr),
     __len__ = interp2app(W_DictViewKeysObject.descr_len),
     __iter__ = interp2app(W_DictViewKeysObject.descr_iter),
@@ -1619,6 +1640,7 @@
 
 W_DictViewValuesObject.typedef = TypeDef(
     "dict_values",
+    __new__ = interp2app(new_dict_values),
     __repr__ = interp2app(W_DictViewValuesObject.descr_repr),
     __len__ = interp2app(W_DictViewValuesObject.descr_len),
     __iter__ = interp2app(W_DictViewValuesObject.descr_iter),
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to