__init__.py
74 lines
| 2.3 KiB
| text/x-python
|
PythonLexer
|
r37513 | # Copyright (c) 2017-present, Gregory Szorc | ||
# All rights reserved. | ||||
# | ||||
# This software may be modified and distributed under the terms | ||||
# of the BSD license. See the LICENSE file for details. | ||||
"""Python interface to the Zstandard (zstd) compression library.""" | ||||
# This module serves 2 roles: | ||||
# | ||||
# 1) Export the C or CFFI "backend" through a central module. | ||||
# 2) Implement additional functionality built on top of C or CFFI backend. | ||||
import os | ||||
import platform | ||||
# Some Python implementations don't support C extensions. That's why we have | ||||
# a CFFI implementation in the first place. The code here import one of our | ||||
# "backends" then re-exports the symbols from this module. For convenience, | ||||
# we support falling back to the CFFI backend if the C extension can't be | ||||
# imported. But for performance reasons, we only do this on unknown Python | ||||
# implementation. Notably, for CPython we require the C extension by default. | ||||
# Because someone will inevitably want special behavior, the behavior is | ||||
# configurable via an environment variable. A potentially better way to handle | ||||
# this is to import a special ``__importpolicy__`` module or something | ||||
# defining a variable and `setup.py` could write the file with whatever | ||||
# policy was specified at build time. Until someone needs it, we go with | ||||
# the hacky but simple environment variable approach. | ||||
|
r44446 | _module_policy = os.environ.get("PYTHON_ZSTANDARD_IMPORT_POLICY", "default") | ||
|
r37513 | |||
|
r44446 | if _module_policy == "default": | ||
if platform.python_implementation() in ("CPython",): | ||||
|
r37513 | from zstd import * | ||
|
r44446 | |||
backend = "cext" | ||||
elif platform.python_implementation() in ("PyPy",): | ||||
|
r42237 | from .cffi import * | ||
|
r44446 | |||
backend = "cffi" | ||||
|
r37513 | else: | ||
try: | ||||
from zstd import * | ||||
|
r44446 | |||
backend = "cext" | ||||
|
r37513 | except ImportError: | ||
|
r42237 | from .cffi import * | ||
|
r44446 | |||
backend = "cffi" | ||||
elif _module_policy == "cffi_fallback": | ||||
|
r37513 | try: | ||
from zstd import * | ||||
|
r44446 | |||
backend = "cext" | ||||
|
r37513 | except ImportError: | ||
|
r42237 | from .cffi import * | ||
|
r44446 | |||
backend = "cffi" | ||||
elif _module_policy == "cext": | ||||
|
r37513 | from zstd import * | ||
|
r44446 | |||
backend = "cext" | ||||
elif _module_policy == "cffi": | ||||
|
r42237 | from .cffi import * | ||
|
r44446 | |||
backend = "cffi" | ||||
|
r37513 | else: | ||
|
r44446 | raise ImportError( | ||
"unknown module import policy: %s; use default, cffi_fallback, " | ||||
"cext, or cffi" % _module_policy | ||||
) | ||||
|
r40157 | |||
# Keep this in sync with python-zstandard.h. | ||||
|
r44446 | __version__ = "0.13.0" | ||