[pypy-commit] pypy py3.3: __dir__ is allowed to return a tuple (it's converted to list like in cpython3).

kvas noreply at buildbot.pypy.org
Sat Jul 26 12:32:31 CEST 2014


Author: Vasily Kuznetsov <kvas.it at gmail.com>
Branch: py3.3
Changeset: r72490:71501209fc12
Date: 2014-07-26 11:22 +0200
http://bitbucket.org/pypy/pypy/changeset/71501209fc12/

Log:	__dir__ is allowed to return a tuple (it's converted to list like in
	cpython3).

diff --git a/pypy/module/__builtin__/app_inspect.py b/pypy/module/__builtin__/app_inspect.py
--- a/pypy/module/__builtin__/app_inspect.py
+++ b/pypy/module/__builtin__/app_inspect.py
@@ -52,6 +52,8 @@
     dir_meth = lookup_special(obj, "__dir__")
     if dir_meth is not None:
         result = dir_meth()
+        if isinstance(result, tuple):
+            result = list(result)
         if not isinstance(result, list):
             raise TypeError("__dir__() must return a list, not %r" % (
                 type(result),))
diff --git a/pypy/module/__builtin__/test/test_dir.py b/pypy/module/__builtin__/test/test_dir.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/__builtin__/test/test_dir.py
@@ -0,0 +1,12 @@
+class AppTestDir:
+
+    def test_dir_obj__dir__tuple(self):
+        """When __dir__ method returns a tuple, python3 converts it to list."""
+
+        class Foo(object):
+            def __dir__(self):
+                return ("b", "c", "a")
+
+        res = dir(Foo())
+        assert isinstance(res, list)
+        assert res == ["a", "b", "c"]


More information about the pypy-commit mailing list