def open(filename, mode='<STR_LIT:rb>', encoding=None, errors='<STR_LIT:strict>', buffering=<NUM_LIT:1>):
if encoding is not None:<EOL><INDENT>if '<STR_LIT>' in mode:<EOL><INDENT>mode = mode.strip().replace('<STR_LIT>', '<STR_LIT>')<EOL>if mode[:<NUM_LIT:1>] not in set('<STR_LIT>'):<EOL><INDENT>mode = '<STR_LIT:r>' + mode<EOL><DEDENT><DEDENT>if '<STR_LIT:b>' not in mode:<EOL><INDENT>mode = mode + '<STR_LIT:b>'<EOL><DEDENT><DEDENT>file = builtins.open(filename, mode, buffering)<EOL>if encoding is None:<EOL><INDENT>return file<EOL><DEDENT>info = lookup(encoding)<EOL>srw = StreamReaderWriter(file, info.streamreader, info.streamwriter, errors)<EOL>srw.encoding = encoding<EOL>return srw<EOL>
Open an encoded file using the given mode and return
        a wrapped version providing transparent encoding/decoding.

        Note: The wrapped version will only accept the object format
        defined by the codecs, i.e. Unicode objects for most builtin
        codecs. Output is also codec dependent and will usually be
        Unicode as well.

        Files are always opened in binary mode, even if no binary mode
        was specified. This is done to avoid data loss due to encodings
        using 8-bit values. The default file mode is 'rb' meaning to
        open the file in binary read mode.

        encoding specifies the encoding which is to be used for the
        file.

        errors may be given to define the error handling. It defaults
        to 'strict' which causes ValueErrors to be raised in case an
        encoding error occurs.

        buffering has the same meaning as for the builtin open() API.
        It defaults to line buffered.

        The returned wrapped file object provides an extra attribute
        .encoding which allows querying the used encoding. This
        attribute is only available if an encoding was specified as
        parameter.