dir2.py
58 lines
| 1.9 KiB
| text/x-python
|
PythonLexer
Brian Granger
|
r2498 | # encoding: utf-8 | ||
"""A fancy version of Python's builtin :func:`dir` function. | ||||
""" | ||||
#----------------------------------------------------------------------------- | ||||
Matthias BUSSONNIER
|
r5390 | # Copyright (C) 2008-2011 The IPython Development Team | ||
Brian Granger
|
r2498 | # | ||
# Distributed under the terms of the BSD License. The full license is in | ||||
# the file COPYING, distributed as part of this software. | ||||
#----------------------------------------------------------------------------- | ||||
#----------------------------------------------------------------------------- | ||||
# Imports | ||||
#----------------------------------------------------------------------------- | ||||
Thomas Kluyver
|
r13353 | from .py3compat import string_types | ||
Brian Granger
|
r2498 | #----------------------------------------------------------------------------- | ||
# Code | ||||
#----------------------------------------------------------------------------- | ||||
Jeffrey Tratner
|
r12965 | |||
def safe_hasattr(obj, attr): | ||||
"""In recent versions of Python, hasattr() only catches AttributeError. | ||||
This catches all errors. | ||||
""" | ||||
try: | ||||
getattr(obj, attr) | ||||
return True | ||||
except: | ||||
return False | ||||
Brian Granger
|
r2498 | def dir2(obj): | ||
"""dir2(obj) -> list of strings | ||||
Extended version of the Python builtin dir(), which does a few extra | ||||
Thomas Kluyver
|
r20729 | checks, and handles Traits objects, which can confuse dir(). | ||
Brian Granger
|
r2498 | |||
This version is guaranteed to return only a list of true strings, whereas | ||||
dir() returns anything that objects inject into themselves, even if they | ||||
are later not really valid for attribute access (many extension libraries | ||||
have such bugs). | ||||
""" | ||||
# Start building the attribute list via dir(), and then complete it | ||||
# with a few extra special-purpose calls. | ||||
sunny
|
r16549 | try: | ||
words = set(dir(obj)) | ||||
sunny
|
r16653 | except Exception: | ||
sunny
|
r16549 | # TypeError: dir(obj) does not return a list | ||
words = set() | ||||
Brian Granger
|
r2498 | |||
# filter out non-string attributes which may be stuffed by dir() calls | ||||
# and poor coding in third-party modules | ||||
Thomas Kluyver
|
r13353 | words = [w for w in words if isinstance(w, string_types)] | ||
Tim Couper
|
r6310 | return sorted(words) | ||