'Returns context_lines before and after lineno from file.
Returns (pre_context_lineno, pre_context, context_line, post_context).'

def _get_lines_from_file(self, filename, lineno, context_lines, loader=None, module_name=None):

    source = None
    if ((loader is not None) and hasattr(loader, 'get_source')):
        source = loader.get_source(module_name)
        if (source is not None):
            source = source.splitlines()
    if (source is None):
        try:
            f = open(filename)
            try:
                source = f.readlines()
            finally:
                f.close()
        except (OSError, IOError):
            pass
    if (source is None):
        return (None, [], None, [])
    encoding = 'ascii'
    for line in source[:2]:
        match = re.search('coding[:=]\\s*([-\\w.]+)', line)
        if match:
            encoding = match.group(1)
            break
    source = [unicode(sline, encoding, 'replace') for sline in source]
    lower_bound = max(0, (lineno - context_lines))
    upper_bound = (lineno + context_lines)
    pre_context = [line.strip('\n') for line in source[lower_bound:lineno]]
    context_line = source[lineno].strip('\n')
    post_context = [line.strip('\n') for line in source[(lineno + 1):upper_bound]]
    return (lower_bound, pre_context, context_line, post_context)
