Author: Benjamin Peterson <benja...@python.org>
Branch: 
Changeset: r44386:73158940f8b6
Date: 2011-05-23 15:49 -0500
http://bitbucket.org/pypy/pypy/changeset/73158940f8b6/

Log:    __dir__() on anything should override the default behavior

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
@@ -62,7 +62,15 @@
 
     obj = args[0]
 
-    if isinstance(obj, types.ModuleType):
+
+    if hasattr(type(obj), "__dir__"):
+        result = type(obj).__dir__(obj)
+        if not isinstance(result, list):
+            raise TypeError("__dir__() must return a list, not %r" % (
+                type(result),))
+        result.sort()
+        return result
+    elif isinstance(obj, types.ModuleType):
         try:
             result = list(obj.__dict__)
             result.sort()
@@ -76,14 +84,6 @@
         result.sort()
         return result
 
-    elif hasattr(type(obj), '__dir__'):
-        result = type(obj).__dir__(obj)
-        if not isinstance(result, list):
-            raise TypeError("__dir__() must return a list, not %r" % (
-                type(result),))
-        result.sort()
-        return result
-
     else: #(regular item)
         Dict = {}
         try:
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
@@ -129,6 +129,11 @@
                 return 42
         f = Foo()
         raises(TypeError, dir, f)
+        import types
+        class Foo(types.ModuleType):
+            def __dir__(self):
+                return ["blah"]
+        assert dir(Foo("a_mod")) == ["blah"]
 
     def test_format(self):
         assert format(4) == "4"
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to