'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, u'get_source')):
        source = loader.get_source(module_name)
        if (source is not None):
            source = source.splitlines()
    if (source is None):
        try:
            with open(filename, u'rb') as fp:
                source = fp.readlines()
        except (OSError, IOError):
            pass
    if (source is None):
        return (None, [], None, [])
    if isinstance(source[0], six.binary_type):
        encoding = u'ascii'
        for line in source[:2]:
            match = re.search('coding[:=]\\s*([-\\w.]+)', line)
            if match:
                encoding = match.group(1).decode(u'ascii')
                break
        source = [six.text_type(sline, encoding, u'replace') for sline in source]
    lower_bound = max(0, (lineno - context_lines))
    upper_bound = (lineno + context_lines)
    pre_context = [line.strip(u'\n') for line in source[lower_bound:lineno]]
    context_line = source[lineno].strip(u'\n')
    post_context = [line.strip(u'\n') for line in source[(lineno + 1):upper_bound]]
    return (lower_bound, pre_context, context_line, post_context)
