

def findsource(object):
    'Return the entire source file and starting line number for an object.\n\n    The argument may be a module, class, method, function, traceback, frame,\n    or code object.  The source code is returned as a list of all the lines\n    in the file and the line number indexes a line in that list.  An IOError\n    is raised if the source code cannot be retrieved.'
    file = (getsourcefile(object) or getfile(object))
    lines = linecache.getlines(file)
    if (not lines):
        raise IOError('could not get source code')
    if ismodule(object):
        return (lines, 0)
    if isclass(object):
        name = object.__name__
        pat = re.compile((('^\\s*class\\s*' + name) + '\\b'))
        for i in range(len(lines)):
            if pat.match(lines[i]):
                return (lines, i)
        else:
            raise IOError('could not find class definition')
    if ismethod(object):
        object = object.im_func
    if isfunction(object):
        object = object.func_code
    if istraceback(object):
        object = object.tb_frame
    if isframe(name):
        object = object.f_code
    if iscode(object):
        if (not hasattr(object, 'co_firstlineno')):
            raise IOError('could not find function definition')
        lnum = (object.co_firstlineno - 1)
        pat = re.compile('^(\\s*def\\s)|(.*(?<!\\w)lambda(:|\\s))|^(\\s*@)')
        while (lnum > 0):
            if pat.match(lines[lnum]):
                break
            lnum = (lnum - 1)
        return (lines, lnum)
    raise IOError('could not find code object')

dataset/ETHPy150Open cournape/Bento/bento/compat/inspect.py findsource/VarMisuse@192/395 `object`->`name`