Module-related python utilities - recursive package scan, modeling of names and modules, etc
Project description
thinking-modules
Part of thinking family.
Module-related python utilities - recursive package scan and import, modeling of names and modules, etc
Main use case for this library is importing everything in given package. Simplest example are decorators that register stuff for CI, a bit like annotation scanning in Java, which need to be triggered/executed before the main portion of your program.
Besides that provides models and related utilities for modules and their names.
Requires python 3.12. Is properly typed.
API
The code is pretty self-documenting (meaning "browse the code, don't expect Sphinx"). It is organized into following modules:
thinking_modules.model
ModuleName
- represent module or package name
- doesn't import the module, is just a pointer
- allows for easy modeling of subpackages, submodules, parent packages, etc
- can refer to non-existent modules
ModuleNamePointer
- union type representing everything that can be parsed to
ModuleName
- astr
, module itself, etc
- union type representing everything that can be parsed to
Module
- is a descriptor over a python module or package
- may refer to non-existing piece of code, but will raise exception when using most methods
- allows you to recognize whether something is a module, package,
pkg.__main__
file or shell session - exposes some other useful info, like whether a module has been already imported, where is it located in filesystem
(if anywhere), what is its root package and allows you to import it with
importlib
- most properties of
Module
andModuleName
are lazy and cached, so, for example, if you create aModule
pointing to a non-existent piece of code, it won't raise exception until you actually accessm.module_object
; similarly, once you accessm.kind
, it will be cached and will be quickly accessible next time you access it - kudos to
lazy
for that
thinking_modules.scan
- holds a single function:
scan(pkg: ModuleNamePointer)
- that function takes a package name (fails if given a non-package module name)
- it analyses filesystem, trying to find all the module names within the tree stemming from that package
- holds a single function:
thinking_modules.main_modules
- when we're running anything, its name becomes
__main__
- that module still should be accessible by name based on its filepath
- for example, if you do
python -m pkg.subpkg.mod
, you'll execute file.../pkg/subpkg/mod.py
which otherwise would be available aspkg.subpkg.mod
, but in such runtime will have__name__
__main__
- this module will analyse (on import) file structure, and expose
main_name
(of typeModuleName
) andmain_module
(of typeModule
) that describepkg.subpkg.mod
(as opposed to__main__
) - it will also (on import) alias
pkg.subpkg.mod
insys.modules
to__main__
, so you can safely do circular imports
- when we're running anything, its name becomes
thinking_modules.definitions
- micro-DSL for queries like:
instance(SomeClass()).type_.defining_module
type_(SomeClass).defining_module
(equivalent to the one above)instance(...).type_.defined_in_module("pkg.mod")
instance(...).type_.defined_in_package("pkg")
(meaning "in packagepkg
or any of its subpackages or submodules)
- nothing complicated, but makes for readable metaprogramming code
- micro-DSL for queries like:
thinking_modules.immutable
- helper module for something that emulates
NamedTuple
, while allowing forlazy
properties - not really related to domain of this project, strictly technical, but pretty useful util
- is needed, as
lazy
works around the__dict__
, which is lacking inNamedTuple
s
- helper module for something that emulates
Reading the test suite is gonna be useful too, in case of uncertainty.
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 Distributions
Built Distribution
File details
Details for the file thinking_modules-0.0.4-py3-none-any.whl
.
File metadata
- Download URL: thinking_modules-0.0.4-py3-none-any.whl
- Upload date:
- Size: 9.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.1.1 CPython/3.12.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 91f55dd9c5fc206ebd101a9cdd9529c560973a48131b68d07944b54fa8e3198e |
|
MD5 | e99a7aaea5d79aa9f474391cba290c08 |
|
BLAKE2b-256 | bde9f12cf811dbf601604834145f0a2c42b491919f4b7056e5417c25188c50da |