Skip to main content

Convenience wrapper for exonware-xwlazy - provides 'import xwlazy' alias

Project description

xwlazy

Fewer "ModuleNotFoundError" detours. Optional auto-install and deferred imports inside a package scope you control, with import-name → PyPI-name mappings (bs4beautifulsoup4, etc.), PEP 668 awareness, and optional audit outputs.

Status Python License Automation

For Python 3.8+, xwlazy can install missing dependencies on first real use and defer heavy imports so startup stays lighter. It is built for library authors who want one-line opt-in per package, not for replacing pinned production installs.


Quick start

1. Install

pip install exonware-xwlazy
# or
pip install xwlazy

xwlazy itself does not use [lazy] / [full] extras; install it directly (commands above) and use [lazy] / [full] on stack packages that depend on it.

  • On a system interpreter, PEP 668 is respected: no silent installs into externally managed environments.
  • Inside a venv, installs use that environment's pip.

2. Enable for your package (one line in __init__.py)

try:
    from exonware.xwlazy import config_package_lazy_install_enabled
    config_package_lazy_install_enabled(__package__ or "yourorg.yourlib", enabled=True, mode="smart")
except ImportError:
    # xwlazy not installed -> normal behavior (no lazy hook)
    pass

Normal import statements stay as they are. Inside the enabled scope you get lazy install and (when policy allows) lazy loading.

3. Zero-code opt-in (optional)

[project]
keywords = ["xwlazy-enabled"]

After pip install -e ., lazy mode can turn on from project metadata.


What you get

Capability What it does
Lazy install First touch on a missing module can trigger pip install for the mapped package.
Lazy loading Selected imports wait until use when your policy enables it.
Per-package scope Each package opts in; others are unchanged.
Keyword opt-in xwlazy-enabled in pyproject.toml enables without code.
Two-stage behavior Import time: log and defer; use time: install then continue.
Policy / audit Allow/deny lists, lockfile, SBOM hooks, PEP 668 checks.
Persist to project Successful installs can append requirements.txt / pyproject.toml. Use XWLAZY_PERSIST_EXTRAS and XWLAZY_NO_PERSIST to control.

Implementation: src/exonware/xwlazy.py; src/xwlazy.py re-exports. src/_old/ is reference-only and is not shipped as the runtime entry.


Built-in mappings

Curated table: src/exonware/xwlazy_external_libs.toml (data/ML, DL, viz, web, formats). Override or extend in your tree if you need custom rows.


Benchmarks vs other lazy-import tools

We run xwlazy next to pipimport, deferred-import, lazy-loader, lazy-imports, pylazyimports, lazi, lazy-imports-lite, etc. See benchmarks/20260209-benchmark competition/README.md.

Latest campaign (Feb 2026, representative numbers):

  • medium_load: ~4.06 ms (xwlazy) vs ~4.54 ms next best in that run.
  • heavy / enterprise: ~14 ms heavy, ~41 ms enterprise with auto-install, isolation, and audit features enabled.

Many competitors only defer imports, or assume import name == pip name. xwlazy adds mapping-aware installs, optional lockfile/SBOM, and per-package isolation. See the feature matrix in the benchmark README.

Common footgun without mapping:

You write Pip package Without mapping
import bs4 beautifulsoup4 pip install bs4 often wrong
import yaml PyYAML pip install yaml fails
import sklearn scikit-learn pip install sklearn fails
import cv2 opencv-python pip install cv2 fails
import PIL Pillow pip install PIL fails
import attr attrs wrong package

Modes and strategies

Strategy Behavior Typical use
smart Uses manifests + mappings Default
pip Plain pip under the hook Explicit pip semantics
wheel Prefer wheels Wheel-rich envs
cached Reuse resolved candidates Repeat runs

No activation → normal imports, no lazy behavior.

from xwlazy import auto_enable_lazy

auto_enable_lazy("xwsystem", mode="smart")

Security and production

  • Deny list in xwlazy_external_libs.toml ([deny_list]).
  • Lockfile (opt-in): with auditing, ~/.xwlazy/xwlazy.lock.toml.
  • Persist: writes to project requirements.txt / pyproject.toml unless disabled (XWLAZY_NO_PERSIST=1, XWLAZY_PERSIST_EXTRAS=...).
  • SBOM (opt-in): generate_sbom()~/.xwlazy/xwlazy_sbom.toml when auditing is on.
  • Async I/O (default): background worker for persist/lockfile/audit. XWLAZY_ASYNC_IO=0 forces sync.
  • PEP 668: no installs into externally managed interpreters; use a venv.

Set XWLAZY_AUDIT_ENABLED=1 before import if you want lockfile/SBOM writes. Auditing is off by default.

Production pattern: pin deps, pre-install in images, keep lazy as a safety net if you accept the trade-offs.


Optional mixins (off by default)

Per-call wrapper API, AST rewrite, and type-stub helpers exist behind env flags. We recommend leaving them off; they add complexity and are easy to miscompose with the core hook.

Feature Env var
Per-call wrapper XWLAZY_PER_CALL_API=1
AST lazy transform XWLAZY_AST_LAZY=1
Type-stub tooling XWLAZY_TYPING_TOOLS=1

Prefer config_package_lazy_install_enabled, auto_enable_lazy, or attach for normal work.


Troubleshooting

from xwlazy import get_all_stats

stats = get_all_stats()
  • Nothing installs: get_lazy_install_stats("your-package") - check enabled and mode, and allow lists.
  • First import slow: first install cost; pre-install with [full] or warm caches.

Docs and tests

Aligned with docs/GUIDE_01_USAGE.md and monorepo GUIDE_63_README.

python tests/runner.py
# or per layer: python tests/0.core/runner.py, python tests/1.unit/runner.py

Ecosystem note

xwlazy combines lazy imports, on-demand install, mapping table, optional lockfile/SBOM, LRU + disk caching, manifests, and deny lists. That is a different shape than "defer import only" libraries.


Ecosystem functional contributions

xwlazy is an infrastructure helper used by other XW packages to control dependency surface and startup behavior. You can use xwlazy standalone in any Python project; it is not limited to XW libraries. Ecosystem-wide adoption is optional and becomes most valuable for enterprise and mission-critical environments where dependency policy, auditability, and self-managed runtime behavior matter.

Downstream XW lib What xwlazy provides to it Functional requirement xwlazy covers
XWSystem Lazy/full optional dependency activation for broad runtime feature sets. Keep base installs lean while enabling rich optional capabilities on demand.
XWFormats Deferred loading/install of heavy format backends. Practical multi-format support without forcing all wheels at install time.
XWStorage / XWData / XWNode Optional backend/strategy dependency handling. Developer-friendly setup and reduced friction in local/CI environments.
XWAPI / XWAuth / API wrappers Controlled optional dependency behavior for server-side extras. Safer progressive rollout of optional engines and integrations.
All XW libs using [lazy] extras Package-scoped lazy policy, mapping-aware installs, and audit hooks. Consistent lazy dependency model across the full ecosystem.

Competitive edge: xwlazy adds mapping-aware install and policy/audit controls, not only import deferral, which is critical for large multi-package ecosystems.


License and links

MIT - see LICENSE.

Async Support

  • xwlazy is primarily synchronous in its current implementation.
  • Source validation: 0 async def definitions and 0 await usages under src/.
  • This module still composes with async-capable xw libraries at integration boundaries when needed.

Version: 1.0.1.68 | Updated: 04-Apr-2026

Built with ❤️ by eXonware.com - Revolutionizing Python Development Since 2025

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

xwlazy-1.0.1.68.tar.gz (121.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

xwlazy-1.0.1.68-py3-none-any.whl (10.8 kB view details)

Uploaded Python 3

File details

Details for the file xwlazy-1.0.1.68.tar.gz.

File metadata

  • Download URL: xwlazy-1.0.1.68.tar.gz
  • Upload date:
  • Size: 121.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for xwlazy-1.0.1.68.tar.gz
Algorithm Hash digest
SHA256 a3331a51e084f8b76bf6ac151475aef57816a9bf2d6d39bea975668c6efbf1ae
MD5 0fcacb4ed4796a955a6f128360855bf1
BLAKE2b-256 8ae791ff0cf2089c99072ad38180d37992f51573c7d89410caa5afff556c5e26

See more details on using hashes here.

File details

Details for the file xwlazy-1.0.1.68-py3-none-any.whl.

File metadata

  • Download URL: xwlazy-1.0.1.68-py3-none-any.whl
  • Upload date:
  • Size: 10.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for xwlazy-1.0.1.68-py3-none-any.whl
Algorithm Hash digest
SHA256 0d85bd533f981732b54d16a0be860af41394c27144f8c155eafd40c080d7082f
MD5 2c4c8efacb1b58fea82f643ff2906767
BLAKE2b-256 0fc7db1c4cc901d77ee2bb244c9fc7be2d9758454bd5a10a27454802fbf5950d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page