Descriptor classes for typed attributes and properties.
Project description
typed-descriptors is a small library of descriptor classes featuring static and runtime typechecking, runtime validation, and other useful features.
Static typechecking is compatible with PEP 484 type hints, and runtime typechecking is performed by the typing-validation library.
Install
You can install the latest release from PyPI as follows:
pip install --upgrade typed-descriptors
Usage
Classes from the typed_descriptors module can be used to create statically typechecked descriptors which implement the following features:
attributes with runtime typechecking on write
attributes with validation on write
readonly attributes (set once)
cached properties
Typechecking is compatible with PEP 484 type hints. Runtime typechecking is performed by the typing-validation library.
Below is a simple example displaying all features listed above:
from collections.abc import Sequence
import networkx as nx # type: ignore
from typed_descriptors import Attr, Prop
class LabelledKn:
r"""
A complete graph :math:`K_n` with readonly size and mutable labels,
where the NetworkX graph object is computed lazily and cached.
"""
n = Attr(int, lambda self, n: n >= 0, readonly=True)
# type ^^^ validation ^^^^^^ ^^^^^^^^^^^^^ attribute is readonly
labels = Attr(Sequence[str], lambda self, labels: len(labels) == self.n)
# type ^^^^^^^^^^^^^ validation ^^^^^^^^^^^^^^^^^^^^^
graph = Prop(nx.Graph, lambda self: nx.complete_graph(self.n))
# type ^^^^^^^^ prop value ^^^^^^^^^^^^^^^^^^^^^^^^^
def __init__(self, n: int, labels: Sequence[int]):
# Setters for Attr instances take care of runtime typechecking and validation
# for the arguments 'n' and 'labels' which have been passed to the constuctor.
self.n = n
self.labels = labels
myobj = LabelledKn(3, ["a", "b", "c"]) # OK
myobj.labels = ("x", "y", "z") # OK
print(myobj.graph.edges) # OK: EdgeView([(0, 1), (0, 2), (1, 2)])
myobj.x = 5 # AttributeError (readonly descriptor)
myobj.y = ["a", "b", "c", "d"] # ValueError (lenght of y is not 3)
myobj.y = 5 # TypeError (type of y is not 'Sequence')
myobj.y = [2, 3, 5] # TypeError (type of y is not 'Sequence[str]')
API
For the full API documentation, see https://typed-descriptors.readthedocs.io/
Contributing
Please see CONTRIBUTING.md.
License
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 typed-descriptors-1.2.2.post2.tar.gz
.
File metadata
- Download URL: typed-descriptors-1.2.2.post2.tar.gz
- Upload date:
- Size: 764.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.12.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a7a41edc5ae7562922bef6162d9455e8d2c9ecb4cbbe43e68d90b188766c6011 |
|
MD5 | d624ab33fecfd9dd3785a44943bcf540 |
|
BLAKE2b-256 | 5df63ba1c51f4006054880d5d8a2e9d224714a85bbe22cb8700daf4da68c0287 |
File details
Details for the file typed_descriptors-1.2.2.post2-py3-none-any.whl
.
File metadata
- Download URL: typed_descriptors-1.2.2.post2-py3-none-any.whl
- Upload date:
- Size: 15.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.12.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 47759c45471dd9a65d89b02ee6019330b468b48bd1e184487e1af845c0779131 |
|
MD5 | b0c0224cbc6e74cf4738dbad676b74c7 |
|
BLAKE2b-256 | 6739440ba7ce2676305825c1090f21c090484f4e1f7638f920949b9fced81c9f |