Author: Benjamin Peterson <[email protected]>
Branch:
Changeset: r44389:25ddcf115505
Date: 2011-05-23 17:50 -0500
http://bitbucket.org/pypy/pypy/changeset/25ddcf115505/
Log: lookup __dir__ correctly
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
@@ -5,6 +5,8 @@
import sys
+from __pypy__ import lookup_special
+
def _caller_locals():
# note: the reason why this is working is because the functions in here are
# compiled by geninterp, so they don't have a frame
@@ -62,9 +64,9 @@
obj = args[0]
-
- if hasattr(type(obj), "__dir__"):
- result = type(obj).__dir__(obj)
+ dir_meth = lookup_special(obj, "__dir__")
+ if dir_meth is not None:
+ result = dir_meth()
if not isinstance(result, list):
raise TypeError("__dir__() must return a list, not %r" % (
type(result),))
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
@@ -135,6 +135,15 @@
return ["blah"]
assert dir(Foo("a_mod")) == ["blah"]
+ def test_dir_custom_lookup(self):
+ class M(type):
+ def __dir__(self, *args): return ["14"]
+ class X(object):
+ __metaclass__ = M
+ x = X()
+ x.__dir__ = lambda x: ["14"]
+ assert dir(x) != ["14"]
+
def test_format(self):
assert format(4) == "4"
assert format(10, "o") == "12"
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit