Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r76795:8374a14307bd
Date: 2015-04-15 12:26 +0200
http://bitbucket.org/pypy/pypy/changeset/8374a14307bd/

Log:    'default_factory' is actually a public read-write attribute on
        CPython.

diff --git a/pypy/module/_collections/app_defaultdict.py 
b/pypy/module/_collections/app_defaultdict.py
--- a/pypy/module/_collections/app_defaultdict.py
+++ b/pypy/module/_collections/app_defaultdict.py
@@ -11,7 +11,7 @@
 
 
 class defaultdict(dict):
-    __slots__ = ['__default_factory']
+    __slots__ = ['default_factory']
 
     def __init__(self, *args, **kwds):
         if len(args) > 0:
@@ -21,7 +21,7 @@
                 raise TypeError("first argument must be callable")
         else:
             default_factory = None
-        defaultdict.__default_factory.__set__(self, default_factory)
+        defaultdict.default_factory.__set__(self, default_factory)
         super(defaultdict, self).__init__(*args, **kwds)
 
     def __missing__(self, key):
@@ -34,13 +34,13 @@
             return "defaultdict(...)"
         try:
             recurse.add(id(self))
-            return "defaultdict(%s, %s)" % (self.__default_factory,
+            return "defaultdict(%s, %s)" % (self.default_factory,
                                             super(defaultdict, 
self).__repr__())
         finally:
             recurse.remove(id(self))
 
     def copy(self):
-        return type(self)(self.__default_factory, self)
+        return type(self)(self.default_factory, self)
 
     __copy__ = copy
 
@@ -56,5 +56,5 @@
 
            This API is used by pickle.py and copy.py.
         """
-        return (type(self), (self.__default_factory,), None, None,
+        return (type(self), (self.default_factory,), None, None,
                 defaultdict.iteritems(self))
diff --git a/pypy/module/_collections/interp_defaultdict.py 
b/pypy/module/_collections/interp_defaultdict.py
--- a/pypy/module/_collections/interp_defaultdict.py
+++ b/pypy/module/_collections/interp_defaultdict.py
@@ -4,8 +4,7 @@
     # An interp-level version of this method.  This is mostly only
     # useful because it can be executed atomically in the presence of
     # threads.
-    w_default_factory = space.getattr(w_self,
-            space.wrap('_defaultdict__default_factory'))
+    w_default_factory = space.getattr(w_self, space.wrap('default_factory'))
     if space.is_w(w_default_factory, space.w_None):
         raise OperationError(space.w_KeyError, space.newtuple([w_key]))
     w_value = space.call_function(w_default_factory)
diff --git a/pypy/module/_collections/test/test_defaultdict.py 
b/pypy/module/_collections/test/test_defaultdict.py
--- a/pypy/module/_collections/test/test_defaultdict.py
+++ b/pypy/module/_collections/test/test_defaultdict.py
@@ -68,3 +68,11 @@
         assert d['5'] == 0
         d['6'] += 3
         assert d['6'] == 3
+
+    def test_default_factory(self):
+        import _collections
+        f = lambda: 42
+        d = _collections.defaultdict(f)
+        assert d.default_factory is f
+        d.default_factory = lambda: 43
+        assert d['5'] == 43
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to