From 86364d02382c3258ac26d7931bf79bccc8fb9fac 2014-05-08 22:53:12 From: MinRK Date: 2014-05-08 22:53:12 Subject: [PATCH] Backport PR #5782: Silence exception thrown by completer when dir() does not return a list ```python In [1]: import SOAPpy In [2]: s = SOAPpy.SOAPProxy('http://abc.com', namespace='xyz') In [3]: s.Traceback (most recent call last): File "IPython/core/completer.py", line 1043, in complete self.matches.extend(matcher(text)) File "IPython/core/completer.py", line 725, in python_matches matches = self.attr_matches(text) File "IPython/core/completer.py", line 403, in attr_matches words = dir2(obj) File "IPython/utils/dir2.py", line 63, in dir2 words = set(dir(obj)) TypeError: __dir__() must return a list, not instance If you suspect this is an IPython bug, please report it at: https://github.com/ipython/ipython/issues or send an email to the mailing list at ipython-dev@scipy.org You can print a more detailed traceback right now with "%tb", or use "%debug" to interactively debug it. Extra-detailed tracebacks for bug-reporting purposes can be enabled via: %config Application.verbose_crash=True File "", line 1 s. ^ SyntaxError: invalid syntax In [4]: dir(s) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) in () ----> 1 dir(s) TypeError: __dir__() must return a list, not instance In [5]: s.__dir__() Out[5]: In [6]: ``` --- diff --git a/IPython/utils/dir2.py b/IPython/utils/dir2.py index 753285b..dd508b4 100644 --- a/IPython/utils/dir2.py +++ b/IPython/utils/dir2.py @@ -60,7 +60,11 @@ def dir2(obj): # Start building the attribute list via dir(), and then complete it # with a few extra special-purpose calls. - words = set(dir(obj)) + try: + words = set(dir(obj)) + except Exception: + # TypeError: dir(obj) does not return a list + words = set() if safe_hasattr(obj, '__class__'): #words.add('__class__')