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)
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)
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
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)