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