lazy-imports-lite changes the semantics of python imports and defers the import until it is used the first time like in PEP 690.
I liked the idea of lazy imports and wanted to use them for my projects without having to change my code. I hope this project allows more people to use lazy imports in their projects.
Key Features
- lazy imports almost like PEP 690
- no code changes required
- can be enabled per module (by keyword in the package)
How is it different to PEP 690?
- It has not the same performance as the implementation from the pep. Every access to parts of imported modules is transformed to an attribute access
x->x._lazy_value. - Exceptions during deferred import are converted to
LazyImportError. - modules which use
execorevalcan not be transformed.
Usage
- add
lazy-imports-liteto your project dependencies. - add lazy-imports-lite-enabled to the keywords of your
pyproject.toml.[project] keywords=["lazy-imports-lite-enabled"]
This enables lazy imports for all top-level imports in your modules in your project. One way to verify if it is enabled is to check which loader is used.
>>> import your_project
>>> print(type(your_project.__spec__.loader))
<class 'lazy_imports_lite._loader.LazyLoader'>
Implementation
lazy-imports-lite works by rewriting the AST at runtime before the code is compiled.
The following code:
from foo import bar
def f():
print(bar())
is internally transformed to:
import lazy_imports_lite._hooks as __lazy_imports_lite__
globals = __lazy_imports_lite__.make_globals(lambda g=globals: g())
bar = __lazy_imports_lite__.ImportFrom(__package__, "foo", "bar")
def f():
print(bar._lazy_value())
This transformation should be never visible to you (the source location is preserved) but it is good to know if something does not work as expected.
You can view a preview of this transformation with lazy-imports-lite preview <filename> if you want to know how your code would be changed.
TODO
- mutable
globals() - cache generated bytecode
Issues
If you encounter any problems, please report an issue along with a detailed description.
License
Distributed under the terms of the MIT license, "lazy-imports-lite" is free and open source software.
Metadata
Release files for lazy-imports-lite 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| lazy_imports_lite-0.1.1.tar.gz | 72.6 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| lazy_imports_lite-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 81.0 kB
Release files / lazy_imports_lite-0.1.1.tar.gz
| Download URL | lazy_imports_lite-0.1.1.tar.gz |
|---|---|
| Size | 72.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5a224df67ba61e5591905446fa6f2eca8305d7ea97945ae8b6fb50123f36eef2
|
|
BLAKE2b-256 checksum How to use checksums |
7dc6facefe0ac215938a87578d81da50e7583849b876142a5700d47302011b12
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
python-httpx/0.25.1
|
Release files / lazy_imports_lite-0.1.1-py3-none-any.whl
| Download URL | lazy_imports_lite-0.1.1-py3-none-any.whl |
|---|---|
| Size | 8.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
db9bb45c325250ebf376d3bce65d30335fcdb3a242f95531b358595a09e342ec
|
|
BLAKE2b-256 checksum How to use checksums |
caa269b5a97010c1ec1c0f2b8601ceee9ea0f082f8d7b9f00b99a7afb0ac5aab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
python-httpx/0.25.1
|
Security for lazy-imports-lite 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.