| | |
| | """A fancy version of Python's builtin :func:`dir` function. |
| | """ |
| |
|
| | |
| | |
| |
|
| | import inspect |
| | import types |
| |
|
| |
|
| | 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 |
| |
|
| |
|
| | def dir2(obj): |
| | """dir2(obj) -> list of strings |
| | |
| | Extended version of the Python builtin dir(), which does a few extra |
| | checks. |
| | |
| | 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). |
| | """ |
| |
|
| | |
| | |
| |
|
| | try: |
| | words = set(dir(obj)) |
| | except Exception: |
| | |
| | words = set() |
| |
|
| | if safe_hasattr(obj, '__class__'): |
| | words |= set(dir(obj.__class__)) |
| |
|
| | |
| | |
| |
|
| | words = [w for w in words if isinstance(w, str)] |
| | return sorted(words) |
| |
|
| |
|
| | def get_real_method(obj, name): |
| | """Like getattr, but with a few extra sanity checks: |
| | |
| | - If obj is a class, ignore everything except class methods |
| | - Check if obj is a proxy that claims to have all attributes |
| | - Catch attribute access failing with any exception |
| | - Check that the attribute is a callable object |
| | |
| | Returns the method or None. |
| | """ |
| | try: |
| | canary = getattr(obj, '_ipython_canary_method_should_not_exist_', None) |
| | except Exception: |
| | return None |
| |
|
| | if canary is not None: |
| | |
| | return None |
| |
|
| | try: |
| | m = getattr(obj, name, None) |
| | except Exception: |
| | return None |
| |
|
| | if inspect.isclass(obj) and not isinstance(m, types.MethodType): |
| | return None |
| |
|
| | if callable(m): |
| | return m |
| |
|
| | return None |
| |
|