(readline)
return default, [first, second]
The detect_encoding() function is used to detect the encoding that should
    be used to decode a Python source file.  It requires one argument, readline,
    in the same way as the tokenize() generator.

    It will call readline a maximum of twice, and return the encoding used
    (as a string) and a list of any lines (left as bytes) it has read in.

    It detects the encoding from the presence of a utf-8 bom or an encoding
    cookie as specified in pep-0263.  If both a bom and a cookie are present,
    but disagree, a SyntaxError will be raised.  If the encoding cookie is an
    invalid charset, raise a SyntaxError.  Note that if a utf-8 bom is found,
    'utf-8-sig' is returned.

    If no encoding is specified, then the default of 'utf-8' will be returned.
The detect_encoding() function is used to detect the encoding that should
    be used to decode a Python source file.  It requires one argument, readline,
    in the same way as the tokenize() generator.
The detect_encoding () function is used to detect the encoding that should be used to decode a Python source file . It requires one argument readline in the same way as the tokenize () generator .
def detect_encoding(readline):
    """
    The detect_encoding() function is used to detect the encoding that should
    be used to decode a Python source file.  It requires one argument, readline,
    in the same way as the tokenize() generator.

    It will call readline a maximum of twice, and return the encoding used
    (as a string) and a list of any lines (left as bytes) it has read in.

    It detects the encoding from the presence of a utf-8 bom or an encoding
    cookie as specified in pep-0263.  If both a bom and a cookie are present,
    but disagree, a SyntaxError will be raised.  If the encoding cookie is an
    invalid charset, raise a SyntaxError.  Note that if a utf-8 bom is found,
    'utf-8-sig' is returned.

    If no encoding is specified, then the default of 'utf-8' will be returned.
    """
    try:
        filename = readline.__self__.name
    except AttributeError:
        filename = None
    bom_found = False
    encoding = None
    default = 'utf-8'
    def read_or_stop():
        try:
            return readline()
        except StopIteration:
            return b''

    def find_cookie(line):
        try:
            # Decode as UTF-8. Either the line is an encoding declaration,
            # in which case it should be pure ASCII, or it must be UTF-8
            # per default encoding.
            line_string = line.decode('utf-8')
        except UnicodeDecodeError:
            msg = "invalid or missing encoding declaration"
            if filename is not None:
                msg = '{} for {!r}'.format(msg, filename)
            raise SyntaxError(msg)

        match = cookie_re.match(line_string)
        if not match:
            return None
        encoding = _get_normal_name(match.group(1))
        try:
            codec = lookup(encoding)
        except LookupError:
            # This behaviour mimics the Python interpreter
            if filename is None:
                msg = "unknown encoding: " + encoding
            else:
                msg = "unknown encoding for {!r}: {}".format(filename,
                        encoding)
            raise SyntaxError(msg)

        if bom_found:
            if encoding != 'utf-8':
                # This behaviour mimics the Python interpreter
                if filename is None:
                    msg = 'encoding problem: utf-8'
                else:
                    msg = 'encoding problem for {!r}: utf-8'.format(filename)
                raise SyntaxError(msg)
            encoding += '-sig'
        return encoding

    first = read_or_stop()
    if first.startswith(BOM_UTF8):
        bom_found = True
        first = first[3:]
        default = 'utf-8-sig'
    if not first:
        return default, []

    encoding = find_cookie(first)
    if encoding:
        return encoding, [first]
    if not blank_re.match(first):
        return default, [first]

    second = read_or_stop()
    if not second:
        return default, [first]

    encoding = find_cookie(second)
    if encoding:
        return encoding, [first, second]

    return default, [first, second]
def detect_encoding ( readline ) : try : filename = readline . __self__ . name except AttributeError : filename = None bom_found = False encoding = None default = 'utf-8' def read_or_stop ( ) : try : return readline ( ) except StopIteration : return b'' def find_cookie ( line ) : try : # Decode as UTF-8. Either the line is an encoding declaration, # in which case it should be pure ASCII, or it must be UTF-8 # per default encoding. line_string = line . decode ( 'utf-8' ) except UnicodeDecodeError : msg = "invalid or missing encoding declaration" if filename is not None : msg = '{} for {!r}' . format ( msg , filename ) raise SyntaxError ( msg ) match = cookie_re . match ( line_string ) if not match : return None encoding = _get_normal_name ( match . group ( 1 ) ) try : codec = lookup ( encoding ) except LookupError : # This behaviour mimics the Python interpreter if filename is None : msg = "unknown encoding: " + encoding else : msg = "unknown encoding for {!r}: {}" . format ( filename , encoding ) raise SyntaxError ( msg ) if bom_found : if encoding != 'utf-8' : # This behaviour mimics the Python interpreter if filename is None : msg = 'encoding problem: utf-8' else : msg = 'encoding problem for {!r}: utf-8' . format ( filename ) raise SyntaxError ( msg ) encoding += '-sig' return encoding first = read_or_stop ( ) if first . startswith ( BOM_UTF8 ) : bom_found = True first = first [ 3 : ] default = 'utf-8-sig' if not first : return default , [ ] encoding = find_cookie ( first ) if encoding : return encoding , [ first ] if not blank_re . match ( first ) : return default , [ first ] second = read_or_stop ( ) if not second : return default , [ first ] encoding = find_cookie ( second ) if encoding : return encoding , [ first , second ] return default , [ first , second ]