PEP 690 like lazy imports for python
Project description
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.
[!NOTE] It is important to note that this project is not affiliated in any way with the original PEP. I hope this project allows a wider adoption of lazy imports, but there is currently no plan to standardize it.
[!IMPORTANT] lazy-imports-lite is still in early development and may contain bugs. Make sure to test your code carefully before you use it.
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
exec
oreval
can not be transformed.
Usage
- add
lazy-imports-lite
to 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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file lazy_imports_lite-0.1.1.tar.gz
.
File metadata
- Download URL: lazy_imports_lite-0.1.1.tar.gz
- Upload date:
- Size: 72.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: python-httpx/0.25.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5a224df67ba61e5591905446fa6f2eca8305d7ea97945ae8b6fb50123f36eef2 |
|
MD5 | f4ae28c8aa3e9b0c28b3070c9743aac1 |
|
BLAKE2b-256 | 7dc6facefe0ac215938a87578d81da50e7583849b876142a5700d47302011b12 |
File details
Details for the file lazy_imports_lite-0.1.1-py3-none-any.whl
.
File metadata
- Download URL: lazy_imports_lite-0.1.1-py3-none-any.whl
- Upload date:
- Size: 8.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: python-httpx/0.25.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | db9bb45c325250ebf376d3bce65d30335fcdb3a242f95531b358595a09e342ec |
|
MD5 | 1eb45bc5326621ebbed2efd10a8f2200 |
|
BLAKE2b-256 | caa269b5a97010c1ec1c0f2b8601ceee9ea0f082f8d7b9f00b99a7afb0ac5aab |