You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			84 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
# encoding: utf-8
 | 
						|
"""A fancy version of Python's builtin :func:`dir` function."""
 | 
						|
 | 
						|
# Copyright (c) IPython Development Team.
 | 
						|
# Distributed under the terms of the Modified BSD License.
 | 
						|
 | 
						|
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).
 | 
						|
    """
 | 
						|
 | 
						|
    # Start building the attribute list via dir(), and then complete it
 | 
						|
    # with a few extra special-purpose calls.
 | 
						|
 | 
						|
    try:
 | 
						|
        words = set(dir(obj))
 | 
						|
    except Exception:
 | 
						|
        # TypeError: dir(obj) does not return a list
 | 
						|
        words = set()
 | 
						|
 | 
						|
    if safe_hasattr(obj, "__class__"):
 | 
						|
        words |= set(dir(obj.__class__))
 | 
						|
 | 
						|
    # filter out non-string attributes which may be stuffed by dir() calls
 | 
						|
    # and poor coding in third-party modules
 | 
						|
 | 
						|
    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:
 | 
						|
        # It claimed to have an attribute it should never have
 | 
						|
        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
 |