summaryrefslogtreecommitdiff
path: root/sphinx/util/inspect.py
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2009-08-06 22:06:19 +0200
committerGeorg Brandl <georg@python.org>2009-08-06 22:06:19 +0200
commit98b67551457e311c6dbd77b7e7ce7043a65f2db5 (patch)
tree6f25a80501a81883aef562f251386125d2f11ae0 /sphinx/util/inspect.py
parentf55c69c7a65d5d735c2084b97a5652ce64745c1f (diff)
downloadsphinx-98b67551457e311c6dbd77b7e7ce7043a65f2db5.tar.gz
#229: Fix autodoc failures with members that raise errors
on ``getattr()``.
Diffstat (limited to 'sphinx/util/inspect.py')
-rw-r--r--sphinx/util/inspect.py43
1 files changed, 43 insertions, 0 deletions
diff --git a/sphinx/util/inspect.py b/sphinx/util/inspect.py
new file mode 100644
index 00000000..9cec5dec
--- /dev/null
+++ b/sphinx/util/inspect.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+"""
+ sphinx.util.inspect
+ ~~~~~~~~~~~~~~~~~~~
+
+ Helpers for inspecting Python modules.
+
+ :copyright: Copyright 2007-2009 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+def isdescriptor(x):
+ """Check if the object is some kind of descriptor."""
+ for item in '__get__', '__set__', '__delete__':
+ if hasattr(safe_getattr(x, item, None), '__call__'):
+ return True
+ return False
+
+
+def safe_getattr(obj, name, *defargs):
+ """A getattr() that turns all exceptions into AttributeErrors."""
+ try:
+ return getattr(obj, name, *defargs)
+ except Exception:
+ # this is a catch-all for all the weird things that some modules do
+ # with attribute access
+ if defargs:
+ return defargs[0]
+ raise AttributeError(name)
+
+
+def safe_getmembers(object, predicate=None):
+ """A version of inspect.getmembers() that uses safe_getattr()."""
+ results = []
+ for key in dir(object):
+ try:
+ value = safe_getattr(object, key, None)
+ except AttributeError:
+ continue
+ if not predicate or predicate(value):
+ results.append((key, value))
+ results.sort()
+ return results