Author: Alex Gaynor <[email protected]>
Branch: kill-single-impl-multimethods
Changeset: r46357:e1b48fe9edc4
Date: 2011-08-07 16:02 -0700
http://bitbucket.org/pypy/pypy/changeset/e1b48fe9edc4/

Log:    Remove more multimethods from dict.

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
@@ -85,9 +85,45 @@
     def descr__new__(space, w_subtype, __args__):
         return W_DictMultiObject.allocate_and_init_instance(space, w_subtype)
 
+    def descr__init__(self, space, __args__):
+        init_or_update(space, self, __args__, 'dict')
+
+    def descr__getitem__(self, space, w_key):
+        w_value = self.getitem(w_key)
+        if w_value is not None:
+            return w_value
+
+        w_missing_item = self.missing_method(space, w_key)
+        if w_missing_item is not None:
+            return w_missing_item
+
+        space.raise_key_error(w_key)
+
+    def descr__setitem__(self, space, w_key, w_value):
+        self.setitem(w_key, w_value)
+
+    def descr__delitem__(self, space, w_key):
+        try:
+            self.delitem(w_key)
+        except KeyError:
+            space.raise_key_error(w_key)
+
+    def descr__contains__(self, space, w_key):
+        return space.newbool(self.getitem(w_key) is not None)
+
+    def descr__len__(self, space):
+        return space.wrap(self.length())
+
     def descr__reversed__(self, space):
         raise OperationError(space.w_TypeError, space.wrap('argument to 
reversed() must be a sequence'))
 
+    def descr__repr__(self, space):
+        ec = space.getexecutioncontext()
+        w_currently_in_repr = ec._py_repr
+        if w_currently_in_repr is None:
+            w_currently_in_repr = ec._py_repr = space.newdict()
+        return dictrepr(space, w_currently_in_repr, self)
+
     def descr_items(self, space):
         """D.items() -> list of D's (key, value) pairs, as 2-tuples"""
         return space.newlist(self.items())
@@ -100,6 +136,9 @@
         """D.values() -> list of D's values"""
         return space.newlist(self.values())
 
+    def descr__iter__(self, space):
+        return W_DictMultiIterObject(space, self.iter(), KEYSITER)
+
     def descr_iteritems(self, space):
         """D.iteritems() -> an iterator over the (key, value) items of D"""
         return W_DictMultiIterObject(space, self.iter(), ITEMSITER)
@@ -169,7 +208,7 @@
 
     def descr_has_key(self, space, w_key):
         """D.has_key(k) -> True if D has a key k, else False"""
-        return space.newbool(self.getitem(w_key) is not None)
+        return self.descr__contains__(space, w_key)
 
     def descr_copy(self, space):
         """D.copy() -> a shallow copy of D"""
@@ -209,6 +248,24 @@
         w_self.iteratorimplementation = iteratorimplementation
         w_self.itertype = itertype
 
+    def descr__iter__(self, space):
+        return self
+
+    def descr_next(self, space):
+        iteratorimplementation = self.iteratorimplementation
+        w_key, w_value = iteratorimplementation.next()
+        if w_key is not None:
+            itertype = self.itertype
+            if itertype == KEYSITER:
+                return w_key
+            elif itertype == VALUESITER:
+                return w_value
+            elif itertype == ITEMSITER:
+                return space.newtuple([w_key, w_value])
+            else:
+                assert 0, "should be unreachable"
+        raise OperationError(space.w_StopIteration, space.w_None)
+
     def descr__reduce__(self, space):
         """
         This is a slightly special case of pickling.
@@ -264,16 +321,23 @@
 
 
 class W_DictViewObject(Wrappable):
-    def __init__(w_self, space, w_dict):
-        w_self.w_dict = w_dict
+    def __init__(self, space, w_dict):
+        self.w_dict = w_dict
+
+    def descr__len__(self, space):
+        return space.len(self.w_dict)
+
+class W_DictViewItemsObject(W_DictViewObject):
+    def descr__iter__(self, space):
+        return self.w_dict.descr_iteritems(space)
 
 class W_DictViewKeysObject(W_DictViewObject):
-    pass
-class W_DictViewItemsObject(W_DictViewObject):
-    pass
+    def descr__iter__(self, space):
+        return self.w_dict.descr_iterkeys(space)
+
 class W_DictViewValuesObject(W_DictViewObject):
-    pass
-
+    def descr__iter__(self, space):
+        return self.w_dict.descr_itervalues(space)
 
 
 class DictStrategy(object):
@@ -727,24 +791,10 @@
 dictrepr = app.interphook("dictrepr")
 
 
-def descr_repr(space, w_dict):
-    ec = space.getexecutioncontext()
-    w_currently_in_repr = ec._py_repr
-    if w_currently_in_repr is None:
-        w_currently_in_repr = ec._py_repr = space.newdict()
-    return dictrepr(space, w_currently_in_repr, w_dict)
-
-
 # ____________________________________________________________
-
-### MULTIMETHOD STUFF
-
 init_signature = Signature(['seq_or_map'], None, 'kwargs')
 init_defaults = [None]
 
-def init__DictMulti(space, w_dict, __args__):
-    init_or_update(space, w_dict, __args__, 'dict')
-
 def update1(space, w_dict, w_data):
     if space.findattr(w_data, space.wrap("keys")) is None:
         # no 'keys' method, so we assume it is a sequence of pairs
@@ -783,36 +833,8 @@
     if space.is_true(w_kwds):
         update1(space, w_dict, w_kwds)
 
+### MULTIMETHOD STUFF
 
-def setitem__DictMulti_ANY_ANY(space, w_dict, w_newkey, w_newvalue):
-    w_dict.setitem(w_newkey, w_newvalue)
-
-def getitem__DictMulti_ANY(space, w_dict, w_key):
-    w_value = w_dict.getitem(w_key)
-    if w_value is not None:
-        return w_value
-
-    w_missing_item = w_dict.missing_method(space, w_key)
-    if w_missing_item is not None:
-        return w_missing_item
-
-    space.raise_key_error(w_key)
-
-def delitem__DictMulti_ANY(space, w_dict, w_key):
-    try:
-        w_dict.delitem(w_key)
-    except KeyError:
-        space.raise_key_error(w_key)
-
-
-def contains__DictMulti_ANY(space, w_dict, w_key):
-    return space.newbool(w_dict.getitem(w_key) is not None)
-
-def len__DictMulti(space, w_dict):
-    return space.wrap(w_dict.length())
-
-def iter__DictMulti(space, w_dict):
-    return W_DictMultiIterObject(space, w_dict.iter(), KEYSITER)
 
 def eq__DictMulti_DictMulti(space, w_left, w_right):
     if space.is_w(w_left, w_right):
@@ -875,37 +897,6 @@
         w_res = space.lt(w_leftval, w_rightval)
     return w_res
 
-def iter__DictMultiIterObject(space, w_dictiter):
-    return w_dictiter
-
-def next__DictMultiIterObject(space, w_dictiter):
-    iteratorimplementation = w_dictiter.iteratorimplementation
-    w_key, w_value = iteratorimplementation.next()
-    if w_key is not None:
-        itertype = w_dictiter.itertype
-        if itertype == KEYSITER:
-            return w_key
-        elif itertype == VALUESITER:
-            return w_value
-        elif itertype == ITEMSITER:
-            return space.newtuple([w_key, w_value])
-        else:
-            assert 0, "should be unreachable"
-    raise OperationError(space.w_StopIteration, space.w_None)
-
-def len__DictViewKeys(space, w_dictview):
-    return space.len(w_dictview.w_dict)
-len__DictViewItems = len__DictViewValues = len__DictViewKeys
-
-def iter__DictViewItems(space, w_dictview):
-    return w_dictview.w_dict.descr_iteritems(space)
-
-def iter__DictViewKeys(space, w_dictview):
-    return w_dictview.w_dict.descr_iterkeys(space)
-
-def iter__DictViewValues(space, w_dictview):
-    return w_dictview.w_dict.descr_itervalues(space)
-
 def all_contained_in(space, w_dictview, w_otherview):
     w_iter = space.iter(w_dictview)
     assert isinstance(w_iter, W_DictMultiIterObject)
@@ -978,11 +969,18 @@
     in the keyword argument list.  For example:  dict(one=1, two=2)''',
     __new__ = gateway.interp2app(W_DictMultiObject.descr__new__.im_func),
     fromkeys = gateway.interp2app(descr_fromkeys, as_classmethod=True),
+    __init__ = gateway.interp2app(W_DictMultiObject.descr__init__),
 
     __hash__ = None,
-    __repr__ = gateway.interp2app(descr_repr),
+    __repr__ = gateway.interp2app(W_DictMultiObject.descr__repr__),
     __reversed__ = gateway.interp2app(W_DictMultiObject.descr__reversed__),
 
+    __len__ = gateway.interp2app(W_DictMultiObject.descr__len__),
+    __getitem__ = gateway.interp2app(W_DictMultiObject.descr__getitem__),
+    __setitem__ = gateway.interp2app(W_DictMultiObject.descr__setitem__),
+    __delitem__ = gateway.interp2app(W_DictMultiObject.descr__delitem__),
+    __iter__ = gateway.interp2app(W_DictMultiObject.descr__iter__),
+
     items = gateway.interp2app(W_DictMultiObject.descr_items),
     keys = gateway.interp2app(W_DictMultiObject.descr_keys),
     values = gateway.interp2app(W_DictMultiObject.descr_values),
@@ -1011,22 +1009,27 @@
 # ____________________________________________________________
 
 W_DictMultiIterObject.typedef = StdTypeDef("dictionaryiterator",
+    __iter__ = gateway.interp2app(W_DictMultiIterObject.descr__iter__),
     __reduce__ = gateway.interp2app(W_DictMultiIterObject.descr__reduce__),
+    next = gateway.interp2app(W_DictMultiIterObject.descr_next),
 )
 
 # ____________________________________________________________
 # Dict views
 
-W_DictViewKeysObject.typedef = StdTypeDef(
-    "dict_keys",
+W_DictViewKeysObject.typedef = StdTypeDef("dict_keys",
+    __len__ = gateway.interp2app(W_DictViewKeysObject.descr__len__),
+    __iter__ = gateway.interp2app(W_DictViewKeysObject.descr__iter__)
 )
 
-W_DictViewItemsObject.typedef = StdTypeDef(
-    "dict_items",
+W_DictViewItemsObject.typedef = StdTypeDef("dict_items",
+    __len__ = gateway.interp2app(W_DictViewItemsObject.descr__len__),
+    __iter__ = gateway.interp2app(W_DictViewItemsObject.descr__iter__),
 )
 
-W_DictViewValuesObject.typedef = StdTypeDef(
-    "dict_values",
+W_DictViewValuesObject.typedef = StdTypeDef("dict_values",
+    __len__ = gateway.interp2app(W_DictViewValuesObject.descr__len__),
+    __iter__ = gateway.interp2app(W_DictViewValuesObject.descr__iter__),
 )
 
 
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
@@ -1,13 +1,13 @@
+import sys
+
 import py
-import sys
+
+from pypy.conftest import gettestobjspace, option
 from pypy.interpreter.error import OperationError
-from pypy.objspace.std.dicttype import (W_DictMultiObject,
-    setitem__DictMulti_ANY_ANY, getitem__DictMulti_ANY, StringDictStrategy,
+from pypy.objspace.std.celldict import ModuleDictStrategy
+from pypy.objspace.std.dicttype import (W_DictMultiObject, StringDictStrategy,
     ObjectDictStrategy)
 
-from pypy.objspace.std.celldict import ModuleDictStrategy
-from pypy.conftest import gettestobjspace
-from pypy.conftest import option
 
 class TestW_DictObject:
 
@@ -917,10 +917,10 @@
         pydict = {}
         for i in range(N):
             x = randint(-N, N)
-            setitem__DictMulti_ANY_ANY(self.space, d, x, i)
+            d.descr__setitem__(self.space, x, i)
             pydict[x] = i
         for key, value in pydict.iteritems():
-            assert value == getitem__DictMulti_ANY(self.space, d, key)
+            assert value == d.descr__getitem__(self.space, key)
 
 class BaseTestRDictImplementation:
 
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to