[pypy-svn] pypy default: (fijal, arigo)

arigo commits-noreply at bitbucket.org
Thu Jan 20 12:01:45 CET 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r40973:b30637b60618
Date: 2011-01-20 11:59 +0100
http://bitbucket.org/pypy/pypy/changeset/b30637b60618/

Log:	(fijal, arigo)

	Support for __dir__().

diff --git a/pypy/module/__builtin__/test/test_builtin.py b/pypy/module/__builtin__/test/test_builtin.py
--- a/pypy/module/__builtin__/test/test_builtin.py
+++ b/pypy/module/__builtin__/test/test_builtin.py
@@ -110,6 +110,19 @@
             __dict__ = 8
         raises(TypeError, dir, Foo("foo"))
 
+    def test_dir_custom(self):
+        class Foo(object):
+            def __dir__(self):
+                return [1, 2, 3]
+        f = Foo()
+        assert dir(f) == [1, 2, 3]
+        #
+        class Foo(object):
+            def __dir__(self):
+                return 42
+        f = Foo()
+        raises(TypeError, dir, f)
+
     def test_format(self):
         assert format(4) == "4"
         assert format(10, "o") == "12"

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
@@ -76,6 +76,13 @@
         result.sort()
         return result
 
+    elif hasattr(obj, '__dir__'):
+        result = obj.__dir__()
+        if not isinstance(result, list):
+            raise TypeError("__dir__() must return a list, not %r" % (
+                type(result),))
+        return result
+
     else: #(regular item)
         Dict = {}
         try:


More information about the Pypy-commit mailing list