def formatfunction(function, name=True, fullname=True,
                   formatvalue=formatvalue.formatvalue, firstarg=True):
    """todo"""
    _id = ""
    if name:
        _id = objectname(function, fullname=fullname)
    try:
        argspec = inspect.getargspec(function)
    except Exception:
        # TypeError: <built-in function chdir> is not a Python function
        # python2
        # python3 OK
        # but TypeError not catched :(
        return "%s()" % str(_id)
    if not formatvalue:
        def _formatvalue(value):
            return ""
        formatvalue = _formatvalue

    args = argspec.args

    if not firstarg:
        cls = getclass(function)
        if inspect.isclass(function) or cls:
            args = args[1:]
    result = inspect.formatargspec(
        args,
        *argspec[1:],
        formatvalue=formatvalue
    )
    # no space = .replace(", ",",")
    return str(_id + result)
Example #2
0
def _prop_name(prop, fullname):
    cls = getclass(prop)
    if not cls:
        return
    name = _cls_attr_name(cls, prop)
    module = inspect.getmodule(cls)
    names = [module.__name__, cls.__name__, name]
    return _str_name(".".join(names), fullname)
Example #3
0
def getattr_info(obj, name):
    # no default :) but we can show more info for debug
    fullname = objectname(obj, fullname=True)
    _type = gettype(obj)
    err = None
    # todo: isgenerator, istraceback, etc...

    if inspect.isbuiltin(obj) and inspect.isroutine(obj):
        _type = "builtin function"
        fullname = fullname.split(".")[-1]
    if isobject(obj) and getclass(obj) is not None:
        # default: 'clsname' object has no attribute 'name'
        cls = getclass(obj)
        if cls:
            fullname = objectname(cls, fullname=True)
            err = "%s object has no attribute '%s'" % (fullname, name)
            # _type = "object"
    if _type:
        err = "%s '%s' has no attribute '%s'" % (_type, fullname, name)
    if err:
        raise AttributeError(err)
    # default
    builtins.getattr(obj, name)
def isoverloaded(obj, cls=None):
    if not obj:
        return False
    if not cls:
        cls = getclass(obj)
    if not cls:
        return False
    name = None
    if hasattr(obj, "__name__"):
        name = obj.__name__
    if isstring(obj):
        name = obj
    if not name:
        return False
    if isinherited(obj, cls):
        return name in cls.__dict__
    return False
def isinherited(obj, cls=None):
    """return True if object inherited from cls
    """
    if obj is None:
        return False
    if not cls:
        cls = getclass(obj)
    if not cls:
        return False
    if hasattr(obj, "__name__"):
        name = obj.__name__
    else:
        name = obj
    for base in cls.__bases__:
        if hasattr(base, name):
            return True
    return False
Example #6
0
def objectname(obj, fullname=False):
    """
    return object fullname with dot
    """
    if obj and isstring(obj):
        return _str_name(obj, fullname)
    if isinstance(obj, property):
        return _prop_name(obj, fullname)
    if not obj or not hasattr(obj, "__name__"):
        return
    name = obj.__name__
    names = []
    module = inspect.getmodule(obj)
    if not inspect.ismodule(obj) and module:
        names.append(os.path.basename(module.__name__))
    cls = getclass(obj)
    if cls and obj != cls:
        name = _cls_attr_name(cls, obj)
        names.append(cls.__name__)
    names.append(name)
    return _str_name(".".join(names), fullname)