:mod:`!compression.zstd` --- Compression compatible with the Zstandard format
=============================================================================

.. module:: compression.zstd
   :synopsis: Low-level interface to compression and decompression routines in
              the zstd library.

.. versionadded:: 3.14

**Source code:** :source:`Lib/compression/zstd/__init__.py`

--------------

This module provides classes and functions for compressing and decompressing
data using the Zstandard (or *zstd*) compression algorithm. The
`zstd manual <https://facebook.github.io/zstd/doc/api_manual_latest.html>`__
describes Zstandard as "a fast lossless compression algorithm, targeting
real-time compression scenarios at zlib-level and better compression ratios."
Also included is a file interface that supports reading and writing the
contents of ``.zst`` files created by the :program:`zstd` utility, as well as
raw zstd compressed streams.

The :mod:`!compression.zstd` module contains:

* The :func:`.open` function and :class:`ZstdFile` class for reading and
  writing compressed files.
* The :class:`ZstdCompressor` and :class:`ZstdDecompressor` classes for
  incremental (de)compression.
* The :func:`compress` and :func:`decompress` functions for one-shot
  (de)compression.
* The :func:`train_dict` and :func:`finalize_dict` functions and the
  :class:`ZstdDict` class to train and manage Zstandard dictionaries.
* The :class:`CompressionParameter`, :class:`DecompressionParameter`, and
  :class:`Strategy` classes for setting advanced (de)compression parameters.

.. include:: ../includes/optional-module.rst


Exceptions
----------

.. exception:: ZstdError

   This exception is raised when an error occurs during compression or
   decompression, or while initializing the (de)compressor state.


Reading and writing compressed files
------------------------------------

.. function:: open(file, /, mode='rb', *, level=None, options=None, \
                   zstd_dict=None, encoding=None, errors=None, newline=None)

   Open a Zstandard-compressed file in binary or text mode, returning a
   :term:`file object`.

   The *file* argument can be either a file name (given as a
   :class:`str`, :class:`bytes` or :term:`path-like <path-like object>`
   object), in which case the named file is opened, or it can be an existing
   file object to read from or write to.

   The mode argument can be either ``'rb'`` for reading (default), ``'wb'`` for
   overwriting, ``'ab'`` for appending, or ``'xb'`` for exclusive creation.
   These can equivalently be given as ``'r'``, ``'w'``, ``'a'``, and ``'x'``
   respectively. You may also open in text mode with ``'rt'``, ``'wt'``,
   ``'at'``, and ``'xt'`` respectively.

   When reading, the *options* argument can be a dictionary providing advanced
   decompression parameters; see :class:`DecompressionParameter` for detailed
   information about supported
   parameters. The *zstd_dict* argument is a :class:`ZstdDict` instance to be
   used during decompression. When reading, if the *level*
   argument is not None, a :exc:`!TypeError` will be raised.

   When writing, the *options* argument can be a dictionary
   providing advanced compression parameters; see
   :class:`CompressionParameter` for detailed information about supported
   parameters. The *level* argument is the compression level to use when
   writing compressed data. Only one of *level* or *options* may be non-None.
   The *zstd_dict* argument is a :class:`ZstdDict` instance to be used during
   compression.

   In binary mode, this function is equivalent to the :class:`ZstdFile`
   constructor: ``ZstdFile(file, mode, ...)``. In this case, the
   *encoding*, *errors*, and *newline* parameters must not be provided.

   In text mode, a :class:`ZstdFile` object is created, and wrapped in an
   :class:`io.TextIOWrapper` instance with the specified encoding, error
   handling behavior, and line endings.


.. class:: ZstdFile(file, /, mode='rb', *, level=None, options=None, \
                    zstd_dict=None)

   Open a Zstandard-compressed file in binary mode.

   A :class:`ZstdFile` can wrap an already-open :term:`file object`, or operate
   directly on a named file. The *file* argument specifies either the file
   object to wrap, or the name of the file to open (as a :class:`str`,
   :class:`bytes` or :term:`path-like <path-like object>` object). If
   wrapping an existing file object, the wrapped file will not be closed when
   the :class:`ZstdFile` is closed.

   The *mode* argument can be either ``'rb'`` for reading (default), ``'wb'``
   for overwriting, ``'xb'`` for exclusive creation, or ``'ab'`` for appending.
   These can equivalently be given as ``'r'``, ``'w'``, ``'x'`` and ``'a'``
   respectively.

   If *file* is a file object (rather than an actual file name), a mode of
   ``'w'`` does not truncate the file, and is instead equivalent to ``'a'``.

   When reading, the *options* argument can be a dictionary
   providing advanced decompression parameters; see
   :class:`DecompressionParameter` for detailed information about supported
   parameters. The *zstd_dict* argument is a :class:`ZstdDict` instance to be
   used during decompression. When reading, if the *level*
   argument is not None, a :exc:`!TypeError` will be raised.

   When writing, the *options* argument can be a dictionary
   providing advanced compression parameters; see
   :class:`CompressionParameter` for detailed information about supported
   parameters. The *level* argument is the compression level to use when
   writing compressed data. Only one of *level* or *options* may be passed. The
   *zstd_dict* argument is a :class:`ZstdDict` instance to be used during
   compression.

   :class:`!ZstdFile` supports all the members specified by
   :class:`io.BufferedIOBase`, except for :meth:`~io.BufferedIOBase.detach`
   and :meth:`~io.IOBase.truncate`.
   Iteration and the :keyword:`with` statement are supported.

   The following method and attributes are also provided:

   .. method:: peek(size=-1)

      Return buffered data without advancing the file position. At least one
      byte of data will be returned, unless EOF has been reached. The exact
      number of bytes returned is unspecified (the *size* argument is ignored).

      .. note:: While calling :meth:`peek` does not change the file position of
         the :class:`ZstdFile`, it may change the position of the underlying
         file object (for example, if the :class:`ZstdFile` was constructed by
         passing a file object for *file*).

   .. attribute:: mode

      ``'rb'`` for reading and ``'wb'`` for writing.

   .. attribute:: name

      The name of the Zstandard file. Equivalent to the :attr:`~io.FileIO.name`
      attribute of the underlying :term:`file object`.


Compressing and decompressing data in memory
--------------------------------------------

.. function:: compress(data, level=None, options=None, zstd_dict=None)

   Compress *data* (a :term:`bytes-like object`), returning the compressed
   data as a :class:`bytes` object.

   The *level* argument is an integer controlling the level of
   compression. *level* is an alternative to setting
   :attr:`CompressionParameter.compression_level` in *options*. Use
   :meth:`~CompressionParameter.bounds` on
   :attr:`~CompressionParameter.compression_level` to get the values that can
   be passed for *level*. If advanced compression options are needed, the
   *level* argument must be omitted and in the *options* dictionary the
   :attr:`!CompressionParameter.compression_level` parameter should be set.

   The *options* argument is a Python dictionary containing advanced
   compression parameters. The valid keys and values for compression parameters
   are documented as part of the :class:`CompressionParameter` documentation.

   The *zstd_dict* argument is an instance of :class:`ZstdDict`
   containing trained data to improve compression efficiency. The
   function :func:`train_dict` can be used to generate a Zstandard dictionary.


.. function:: decompress(data, zstd_dict=None, options=None)

   Decompress *data* (a :term:`bytes-like object`), returning the uncompressed
   data as a :class:`bytes` object.

   The *options* argument is a Python dictionary containing advanced
   decompression parameters. The valid keys and values for compression
   parameters are documented as part of the :class:`DecompressionParameter`
   documentation.

   The *zstd_dict* argument is an instance of :class:`ZstdDict`
   containing trained data used during compression. This must be
   the same Zstandard dictionary used during compression.

   If *data* is the concatenation of multiple distinct compressed frames,
   decompress all of these frames, and return the concatenation of the results.


.. class:: ZstdCompressor(level=None, options=None, zstd_dict=None)

   Create a compressor object, which can be used to compress data
   incrementally.

   For a more convenient way of compressing a single chunk of data, see the
   module-level function :func:`compress`.

   The *level* argument is an integer controlling the level of
   compression. *level* is an alternative to setting
   :attr:`CompressionParameter.compression_level` in *options*. Use
   :meth:`~CompressionParameter.bounds` on
   :attr:`~CompressionParameter.compression_level` to get the values that can
   be passed for *level*. If advanced compression options are needed, the
   *level* argument must be omitted and in the *options* dictionary the
   :attr:`!CompressionParameter.compression_level` parameter should be set.

   The *options* argument is a Python dictionary containing advanced
   compression parameters. The valid keys and values for compression parameters
   are documented as part of the :class:`CompressionParameter` documentation.

   The *zstd_dict* argument is an optional instance of :class:`ZstdDict`
   containing trained data to improve compression efficiency. The
   function :func:`train_dict` can be used to generate a Zstandard dictionary.


   .. method:: compress(data, mode=ZstdCompressor.CONTINUE)

      Compress *data* (a :term:`bytes-like object`), returning a :class:`bytes`
      object with compressed data if possible, or otherwise an empty
      :class:`!bytes` object. Some of *data* may be buffered internally, for
      use in later calls to :meth:`!compress` and :meth:`~.flush`. The returned
      data should be concatenated with the output of any previous calls to
      :meth:`~.compress`.

      The *mode* argument is a :class:`ZstdCompressor` attribute, either
      :attr:`~.CONTINUE`, :attr:`~.FLUSH_BLOCK`,
      or :attr:`~.FLUSH_FRAME`.

      When all data has been provided to the compressor, call the
      :meth:`~.flush` method to finish the compression process. If
      :meth:`~.compress` is called with *mode* set to :attr:`~.FLUSH_FRAME`,
      :meth:`~.flush` should not be called, as it would write out a new empty
      frame.

   .. method:: flush(mode=ZstdCompressor.FLUSH_FRAME)

      Finish the compression process, returning a :class:`bytes` object
      containing any data stored in the compressor's internal buffers.

      The *mode* argument is a :class:`ZstdCompressor` attribute, either
      :attr:`~.FLUSH_BLOCK`, or :attr:`~.FLUSH_FRAME`.

   .. method:: set_pledged_input_size(size)

      Specify the amount of uncompressed data *size* that will be provided for
      the next frame. *size* will be written into the frame header of the next
      frame unless :attr:`CompressionParameter.content_size_flag` is ``False``
      or ``0``. A size of ``0`` means that the frame is empty. If *size* is
      ``None``, the frame header will omit the frame size. Frames that include
      the uncompressed data size require less memory to decompress, especially
      at higher compression levels.

      If :attr:`last_mode` is not :attr:`FLUSH_FRAME`, a
      :exc:`ValueError` is raised as the compressor is not at the start of
      a frame. If the pledged size does not match the actual size of data
      provided to :meth:`.compress`, future calls to :meth:`!compress` or
      :meth:`flush` may raise :exc:`ZstdError` and the last chunk of data may
      be lost.

      After :meth:`flush` or :meth:`.compress` are called with mode
      :attr:`FLUSH_FRAME`, the next frame will not include the frame size into
      the header unless :meth:`!set_pledged_input_size` is called again.

   .. attribute:: CONTINUE

      Collect more data for compression, which may or may not generate output
      immediately. This mode optimizes the compression ratio by maximizing the
      amount of data per block and frame.

   .. attribute:: FLUSH_BLOCK

      Complete and write a block to the data stream. The data returned so far
      can be immediately decompressed. Past data can still be referenced in
      future blocks generated by calls to :meth:`~.compress`,
      improving compression.

   .. attribute:: FLUSH_FRAME

      Complete and write out a frame. Future data provided to
      :meth:`~.compress` will be written into a new frame and
      *cannot* reference past data.

   .. attribute:: last_mode

      The last mode passed to either :meth:`~.compress` or :meth:`~.flush`.
      The value can be one of :attr:`~.CONTINUE`, :attr:`~.FLUSH_BLOCK`, or
      :attr:`~.FLUSH_FRAME`. The initial value is :attr:`~.FLUSH_FRAME`,
      signifying that the compressor is at the start of a new frame.


.. class:: ZstdDecompressor(zstd_dict=None, options=None)

   Create a decompressor object, which can be used to decompress data
   incrementally.

   For a more convenient way of decompressing an entire compressed stream at
   once, see the module-level function :func:`decompress`.

   The *options* argument is a Python dictionary containing advanced
   decompression parameters. The valid keys and values for compression
   parameters are documented as part of the :class:`DecompressionParameter`
   documentation.

   The *zstd_dict* argument is an instance of :class:`ZstdDict`
   containing trained data used during compression. This must be
   the same Zstandard dictionary used during compression.

   .. note::
      This class does not transparently handle inputs containing multiple
      compressed frames, unlike the :func:`decompress` function and
      :class:`ZstdFile` class. To decompress a multi-frame input, you should
      use :func:`decompress`, :class:`ZstdFile` if working with a
      :term:`file object`, or multiple :class:`!ZstdDecompressor` instances.

   .. method:: decompress(data, max_length=-1)

      Decompress *data* (a :term:`bytes-like object`), returning
      uncompressed data as bytes. Some of *data* may be buffered
      internally, for use in later calls to :meth:`!decompress`.
      The returned data should be concatenated with the output of any previous
      calls to :meth:`!decompress`.

      If *max_length* is non-negative, the method returns at most *max_length*
      bytes of decompressed data. If this limit is reached and further
      output can be produced, the :attr:`~.needs_input` attribute will
      be set to ``False``. In this case, the next call to
      :meth:`~.decompress` may provide *data* as ``b''`` to obtain
      more of the output.

      If all of the input data was decompressed and returned (either
      because this was less than *max_length* bytes, or because
      *max_length* was negative), the :attr:`~.needs_input` attribute
      will be set to ``True``.

      Attempting to decompress data after the end of a frame will raise a
      :exc:`ZstdError`. Any data found after the end of the frame is ignored
      and saved in the :attr:`~.unused_data` attribute.

   .. attribute:: eof

      ``True`` if the end-of-stream marker has been reached.

   .. attribute:: unused_data

      Data found after the end of the compressed stream.

      Before the end of the stream is reached, this will be ``b''``.

   .. attribute:: needs_input

      ``False`` if the :meth:`.decompress` method can provide more
      decompressed data before requiring new compressed input.


Zstandard dictionaries
----------------------


.. function:: train_dict(samples, dict_size)

   Train a Zstandard dictionary, returning a :class:`ZstdDict` instance.
   Zstandard dictionaries enable more efficient compression of smaller sizes
   of data, which is traditionally difficult to compress due to less
   repetition. If you are compressing multiple similar groups of data (such as
   similar files), Zstandard dictionaries can improve compression ratios and
   speed significantly.

   The *samples* argument (an iterable of :class:`bytes` objects), is the
   population of samples used to train the Zstandard dictionary.

   The *dict_size* argument, an integer, is the maximum size (in bytes) the
   Zstandard dictionary should be. The Zstandard documentation suggests an
   absolute maximum of no more than 100 KB, but the maximum can often be smaller
   depending on the data. Larger dictionaries generally slow down compression,
   but improve compression ratios. Smaller dictionaries lead to faster
   compression, but reduce the compression ratio.


.. function:: finalize_dict(zstd_dict, /, samples, dict_size, level)

   An advanced function for converting a "raw content" Zstandard dictionary into
   a regular Zstandard dictionary. "Raw content" dictionaries are a sequence of
   bytes that do not need to follow the structure of a normal Zstandard
   dictionary.

   The *zstd_dict* argument is a :class:`ZstdDict` instance with
   the :attr:`~ZstdDict.dict_content` containing the raw dictionary contents.

   The *samples* argument (an iterable of :class:`bytes` objects), contains
   sample data for generating the Zstandard dictionary.

   The *dict_size* argument, an integer, is the maximum size (in bytes) the
   Zstandard dictionary should be. See :func:`train_dict` for
   suggestions on the maximum dictionary size.

   The *level* argument (an integer) is the compression level expected to be
   passed to the compressors using this dictionary. The dictionary information
   varies for each compression level, so tuning for the proper compression
   level can make compression more efficient.


.. class:: ZstdDict(dict_content, /, *, is_raw=False)

   A wrapper around Zstandard dictionaries. Dictionaries can be used to improve
   the compression of many small chunks of data. Use :func:`train_dict` if you
   need to train a new dictionary from sample data.

   The *dict_content* argument (a :term:`bytes-like object`), is the already
   trained dictionary information.

   The *is_raw* argument, a boolean, is an advanced parameter controlling the
   meaning of *dict_content*. ``True`` means *dict_content* is a "raw content"
   dictionary, without any format restrictions. ``False`` means *dict_content*
   is an ordinary Zstandard dictionary, created from Zstandard functions,
   for example, :func:`train_dict` or the external :program:`zstd` CLI.

   When passing a :class:`!ZstdDict` to a function, the
   :attr:`!as_digested_dict` and :attr:`!as_undigested_dict` attributes can
   control how the dictionary is loaded by passing them as the ``zstd_dict``
   argument, for example, ``compress(data, zstd_dict=zd.as_digested_dict)``.
   Digesting a dictionary is a costly operation that occurs when loading a
   Zstandard dictionary. When making multiple calls to compression or
   decompression, passing a digested dictionary will reduce the overhead of
   loading the dictionary.

    .. list-table:: Difference for compression
       :widths: 10 14 10
       :header-rows: 1

       * -
         - Digested dictionary
         - Undigested dictionary
       * - Advanced parameters of the compressor which may be overridden by
           the dictionary's parameters
         - ``window_log``, ``hash_log``, ``chain_log``, ``search_log``,
           ``min_match``, ``target_length``, ``strategy``,
           ``enable_long_distance_matching``, ``ldm_hash_log``,
           ``ldm_min_match``, ``ldm_bucket_size_log``, ``ldm_hash_rate_log``,
           and some non-public parameters.
         - None
       * - :class:`!ZstdDict` internally caches the dictionary
         - Yes. It's faster when loading a digested dictionary again with the
           same compression level.
         - No. If you wish to load an undigested dictionary multiple times,
           consider reusing a compressor object.

   If passing a :class:`!ZstdDict` without any attribute, an undigested
   dictionary is passed by default when compressing and a digested dictionary
   is generated if necessary and passed by default when decompressing.

    .. attribute:: dict_content

        The content of the Zstandard dictionary, a ``bytes`` object. It's the
        same as the *dict_content* argument in the ``__init__`` method. It can
        be used with other programs, such as the ``zstd`` CLI program.

    .. attribute:: dict_id

        Identifier of the Zstandard dictionary, a non-negative int value.

        Non-zero means the dictionary is ordinary, created by Zstandard
        functions and following the Zstandard format.

        ``0`` means a "raw content" dictionary, free of any format restriction,
        used for advanced users.

        .. note::

            The meaning of ``0`` for :attr:`!ZstdDict.dict_id` is different
            from the ``dictionary_id`` attribute to the :func:`get_frame_info`
            function.

    .. attribute:: as_digested_dict

        Load as a digested dictionary.

    .. attribute:: as_undigested_dict

        Load as an undigested dictionary.


Advanced parameter control
--------------------------

.. class:: CompressionParameter()

   An :class:`~enum.IntEnum` containing the advanced compression parameter
   keys that can be used when compressing data.

   The :meth:`~.bounds` method can be used on any attribute to get the valid
   values for that parameter.

   Parameters are optional; any omitted parameter will have it's value selected
   automatically.

   Example getting the lower and upper bound of :attr:`~.compression_level`::

      lower, upper = CompressionParameter.compression_level.bounds()

   Example setting the :attr:`~.window_log` to the maximum size::

      _lower, upper = CompressionParameter.window_log.bounds()
      options = {CompressionParameter.window_log: upper}
      compress(b'venezuelan beaver cheese', options=options)

   .. method:: bounds()

      Return the tuple of int bounds, ``(lower, upper)``, of a compression
      parameter. This method should be called on the attribute you wish to
      retrieve the bounds of. For example, to get the valid values for
      :attr:`~.compression_level`, one may check the result of
      ``CompressionParameter.compression_level.bounds()``.

      Both the lower and upper bounds are inclusive.

   .. attribute:: compression_level

      A high-level means of setting other compression parameters that affect
      the speed and ratio of compressing data.

      Regular compression levels are greater than ``0``. Values greater than
      ``20`` are considered "ultra" compression and require more memory than
      other levels. Negative values can be used to trade off faster compression
      for worse compression ratios.

      Setting the level to zero uses :attr:`COMPRESSION_LEVEL_DEFAULT`.

   .. attribute:: window_log

      Maximum allowed back-reference distance the compressor can use when
      compressing data, expressed as power of two, ``1 << window_log`` bytes.
      This parameter greatly influences the memory usage of compression. Higher
      values require more memory but gain better compression values.

      A value of zero causes the value to be selected automatically.

   .. attribute:: hash_log

      Size of the initial probe table, as a power of two. The resulting memory
      usage is ``1 << (hash_log+2)`` bytes. Larger tables improve compression
      ratio of strategies <= :attr:`~Strategy.dfast`, and improve compression
      speed of strategies > :attr:`~Strategy.dfast`.

      A value of zero causes the value to be selected automatically.

   .. attribute:: chain_log

      Size of the multi-probe search table, as a power of two. The resulting
      memory usage is ``1 << (chain_log+2)`` bytes. Larger tables result in
      better and slower compression. This parameter has no effect for the
      :attr:`~Strategy.fast` strategy. It's still useful when using
      :attr:`~Strategy.dfast` strategy, in which case it defines a secondary
      probe table.

      A value of zero causes the value to be selected automatically.

   .. attribute:: search_log

      Number of search attempts, as a power of two. More attempts result in
      better and slower compression. This parameter is useless for
      :attr:`~Strategy.fast` and :attr:`~Strategy.dfast` strategies.

      A value of zero causes the value to be selected automatically.

   .. attribute:: min_match

      Minimum size of searched matches. Larger values increase compression and
      decompression speed, but decrease ratio. Note that Zstandard can still
      find matches of smaller size, it just tweaks its search algorithm to look
      for this size and larger. For all strategies < :attr:`~Strategy.btopt`,
      the effective minimum is ``4``; for all strategies
      > :attr:`~Strategy.fast`, the effective maximum is ``6``.

      A value of zero causes the value to be selected automatically.

   .. attribute:: target_length

      The impact of this field depends on the selected :class:`Strategy`.

      For strategies :attr:`~Strategy.btopt`, :attr:`~Strategy.btultra` and
      :attr:`~Strategy.btultra2`, the value is the length of a match
      considered "good enough" to stop searching. Larger values make
      compression ratios better, but compresses slower.

      For strategy :attr:`~Strategy.fast`, it is the distance between match
      sampling. Larger values make compression faster, but with a worse
      compression ratio.

      A value of zero causes the value to be selected automatically.

   .. attribute:: strategy

      The higher the value of selected strategy, the more complex the
      compression technique used by zstd, resulting in higher compression
      ratios but slower compression.

      .. seealso:: :class:`Strategy`

   .. attribute:: enable_long_distance_matching

      Long distance matching can be used to improve compression for large
      inputs by finding large matches at greater distances. It increases memory
      usage and window size.

      ``True`` or ``1`` enable long distance matching while ``False`` or ``0``
      disable it.

      Enabling this parameter increases default
      :attr:`~CompressionParameter.window_log` to 128 MiB except when expressly
      set to a different value. This setting is enabled by default if
      :attr:`!window_log` >= 128 MiB and the compression
      strategy >= :attr:`~Strategy.btopt` (compression level 16+).

   .. attribute:: ldm_hash_log

      Size of the table for long distance matching, as a power of two. Larger
      values increase memory usage and compression ratio, but decrease
      compression speed.

      A value of zero causes the value to be selected automatically.

   .. attribute:: ldm_min_match

      Minimum match size for long distance matcher. Larger or too small values
      can often decrease the compression ratio.

      A value of zero causes the value to be selected automatically.

   .. attribute:: ldm_bucket_size_log

      Log size of each bucket in the long distance matcher hash table for
      collision resolution. Larger values improve collision resolution but
      decrease compression speed.

      A value of zero causes the value to be selected automatically.

   .. attribute:: ldm_hash_rate_log

      Frequency of inserting/looking up entries into the long distance matcher
      hash table. Larger values improve compression speed. Deviating far from
      the default value will likely result in a compression ratio decrease.

      A value of zero causes the value to be selected automatically.

   .. attribute:: content_size_flag

      Write the size of the data to be compressed into the Zstandard frame
      header when known prior to compressing.

      This flag only takes effect under the following scenarios:

      * Calling :func:`compress` for one-shot compression
      * Providing all of the data to be compressed in the frame in a single
        :meth:`ZstdCompressor.compress` call, with the
        :attr:`ZstdCompressor.FLUSH_FRAME` mode.
      * Calling :meth:`ZstdCompressor.set_pledged_input_size` with the exact
        amount of data that will be provided to the compressor prior to any
        calls to :meth:`ZstdCompressor.compress` for the current frame.
        :meth:`!ZstdCompressor.set_pledged_input_size` must be called for each
        new frame.

      All other compression calls may not write the size information into the
      frame header.

      ``True`` or ``1`` enable the content size flag while ``False`` or ``0``
      disable it.

   .. attribute:: checksum_flag

      A four-byte checksum using XXHash64 of the uncompressed content is
      written at the end of each frame. Zstandard's decompression code verifies
      the checksum. If there is a mismatch a :class:`ZstdError` exception is
      raised.

      ``True`` or ``1`` enable checksum generation while ``False`` or ``0``
      disable it.

   .. attribute:: dict_id_flag

      When compressing with a :class:`ZstdDict`, the dictionary's ID is written
      into the frame header.

      ``True`` or ``1`` enable storing the dictionary ID while ``False`` or
      ``0`` disable it.

   .. attribute:: nb_workers

      Select how many threads will be spawned to compress in parallel. When
      :attr:`!nb_workers` > 0, enables multi-threaded compression, a value of
      ``1`` means "one-thread multi-threaded mode". More workers improve speed,
      but also increase memory usage and slightly reduce compression ratio.

      A value of zero disables multi-threading.

   .. attribute:: job_size

      Size of a compression job, in bytes. This value is enforced only when
      :attr:`~CompressionParameter.nb_workers` >= 1. Each compression job is
      completed in parallel, so this value can indirectly impact the number of
      active threads.

      A value of zero causes the value to be selected automatically.

   .. attribute:: overlap_log

      Sets how much data is reloaded from previous jobs (threads) for new jobs
      to be used by the look behind window during compression. This value is
      only used when :attr:`~CompressionParameter.nb_workers` >= 1. Acceptable
      values vary from 0 to 9.

         * 0 means dynamically set the overlap amount
         * 1 means no overlap
         * 9 means use a full window size from the previous job

      Each increment halves/doubles the overlap size. "8" means an overlap of
      ``window_size/2``, "7" means an overlap of ``window_size/4``, etc.

.. class:: DecompressionParameter()

   An :class:`~enum.IntEnum` containing the advanced decompression parameter
   keys that can be used when decompressing data. Parameters are optional; any
   omitted parameter will have it's value selected automatically.

   The :meth:`~.bounds` method can be used on any attribute to get the valid
   values for that parameter.

   Example setting the :attr:`~.window_log_max` to the maximum size::

      data = compress(b'Some very long buffer of bytes...')

      _lower, upper = DecompressionParameter.window_log_max.bounds()

      options = {DecompressionParameter.window_log_max: upper}
      decompress(data, options=options)

   .. method:: bounds()

      Return the tuple of int bounds, ``(lower, upper)``, of a decompression
      parameter. This method should be called on the attribute you wish to
      retrieve the bounds of.

      Both the lower and upper bounds are inclusive.

   .. attribute:: window_log_max

      The base-two logarithm of the maximum size of the window used during
      decompression. This can be useful to limit the amount of memory used when
      decompressing data. A larger maximum window size leads to faster
      decompression.

      A value of zero causes the value to be selected automatically.


.. class:: Strategy()

   An :class:`~enum.IntEnum` containing strategies for compression.
   Higher-numbered strategies correspond to more complex and slower
   compression.

   .. note::

      The values of attributes of :class:`!Strategy` are not necessarily stable
      across zstd versions. Only the ordering of the attributes may be relied
      upon. The attributes are listed below in order.

   The following strategies are available:

   .. attribute:: fast

   .. attribute:: dfast

   .. attribute:: greedy

   .. attribute:: lazy

   .. attribute:: lazy2

   .. attribute:: btlazy2

   .. attribute:: btopt

   .. attribute:: btultra

   .. attribute:: btultra2


Miscellaneous
-------------

.. function:: get_frame_info(frame_buffer)

   Retrieve a :class:`FrameInfo` object containing metadata about a Zstandard
   frame. Frames contain metadata related to the compressed data they hold.


.. class:: FrameInfo

   Metadata related to a Zstandard frame.

   .. attribute:: decompressed_size

      The size of the decompressed contents of the frame.

   .. attribute:: dictionary_id

      An integer representing the Zstandard dictionary ID needed for
      decompressing the frame. ``0`` means the dictionary ID was not
      recorded in the frame header. This may mean that a Zstandard dictionary
      is not needed, or that the ID of a required dictionary was not recorded.


.. attribute:: COMPRESSION_LEVEL_DEFAULT

   The default compression level for Zstandard: ``3``.


.. attribute:: zstd_version_info

   Version number of the runtime zstd library as a tuple of integers
   (major, minor, release).


Examples
--------

Reading in a compressed file:

.. code-block:: python

   from compression import zstd

   with zstd.open("file.zst") as f:
       file_content = f.read()

Creating a compressed file:

.. code-block:: python

   from compression import zstd

   data = b"Insert Data Here"
   with zstd.open("file.zst", "w") as f:
       f.write(data)

Compressing data in memory:

.. code-block:: python

   from compression import zstd

   data_in = b"Insert Data Here"
   data_out = zstd.compress(data_in)

Incremental compression:

.. code-block:: python

   from compression import zstd

   comp = zstd.ZstdCompressor()
   out1 = comp.compress(b"Some data\n")
   out2 = comp.compress(b"Another piece of data\n")
   out3 = comp.compress(b"Even more data\n")
   out4 = comp.flush()
   # Concatenate all the partial results:
   result = b"".join([out1, out2, out3, out4])

Writing compressed data to an already-open file:

.. code-block:: python

   from compression import zstd

   with open("myfile", "wb") as f:
       f.write(b"This data will not be compressed\n")
       with zstd.open(f, "w") as zstf:
           zstf.write(b"This *will* be compressed\n")
       f.write(b"Not compressed\n")

Creating a compressed file using compression parameters:

.. code-block:: python

   from compression import zstd

   options = {
      zstd.CompressionParameter.checksum_flag: 1
   }
   with zstd.open("file.zst", "w", options=options) as f:
       f.write(b"Mind if I squeeze in?")
