'Return context_lines before and after lineno from file.
Return (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')):
        with suppress(ImportError):
            source = loader.get_source(module_name)
        if (source is not None):
            source = source.splitlines()
    if (source is None):
        with suppress(OSError, IOError):
            with open(filename, 'rb') as fp:
                source = fp.read().splitlines()
    if (source is None):
        return (None, [], None, [])
    if isinstance(source[0], bytes):
        encoding = 'ascii'
        for line in source[:2]:
            match = re.search('coding[:=]\\s*([-\\w.]+)', line)
            if match:
                encoding = match.group(1).decode('ascii')
                break
        source = [str(sline, encoding, 'replace') for sline in source]
    lower_bound = max(0, (lineno - context_lines))
    upper_bound = (lineno + context_lines)
    pre_context = source[lower_bound:lineno]
    context_line = source[lineno]
    post_context = source[(lineno + 1):upper_bound]
    return (lower_bound, pre_context, context_line, post_context)
