annotation-protocol
The AnnotationProtocol allows for more thorough isinstance checks in python. Specifically, it adds the following functionality beyond typing.Protocol.
- Check that all attributes from the class
otherthat should adhere to theprotocolare present in it. - Attributes, input arguments and return arguments need ot have the same type annotations between
protocolandother.
Author: Royal HaskoningDHV
Email: ruud.kassing@rhdhv.com, jesse.de.ruijter@rhdhv.com, miguel.hernandez@rhdhv.com, steffen.burgers@rhdhv.com, pierpaolo.lucarelli@rhdhv.com
Installation
Use the package manager pip to install annotation-protocol.
pip install annotation-protocol
Background
The Protocol class from the typing package can be used to create templates of classes with specific attributes and methods. We can check if a class adheres to a given Protocol by doing an isinstance check of the form isinstance(MyClass(), MyProtocol). The AnnotationProtocol extends this functionality by also checking if all type-hints are the same for each attribute, method argument and method output.
Usage
For clarity, in the examples below we compare the standard Protocol from the typing package against the AnnotationProtocol. Note that only the AnnotationProtocol returns False when there is a mismatch in type-hints.
from typing import Protocol, runtime_checkable
from annotation_protocol import AnnotationProtocol
@runtime_checkable
class MyProtocol(Protocol):
def testfun(my_arg: str | list) -> set:
...
class MyAnnotationProtocol(AnnotationProtocol):
def testfun(my_arg: str | list) -> set:
...
class ClassShouldPass:
def testfun(my_arg: str) -> set:
return set()
class ClassShouldFail:
def testfun(my_arg: dict) -> set:
return set()
print(f"Protocol: {isinstance(ClassShouldPass(), MyProtocol)}") # returns True
print(f"Protocol: {isinstance(ClassShouldFail(), MyProtocol)}") # returns True
print(f"AnnotationProtocol: {isinstance(ClassShouldPass(), MyAnnotationProtocol)}") # returns True
print(f"AnnotationProtocol: {isinstance(ClassShouldFail(), MyAnnotationProtocol)}") # returns False
Note that it is possible to have a subset of type annotations in the ClassShouldPass class compared to the MyAnnotationProtocol. In other words it is not necessary to have all types of a UnionType group of types from the protocol in the class that should adhere to the protocol.
Contributing
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
Please make sure to update tests as appropriate.
License
Metadata
Release files for annotation-protocol 1.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| annotation_protocol-1.4.0.tar.gz | 8.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| annotation_protocol-1.4.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 16.3 kB
Release files / annotation_protocol-1.4.0.tar.gz
| Download URL | annotation_protocol-1.4.0.tar.gz |
|---|---|
| Size | 8.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
15d846a4984339bab6cbf80a44623219b8cb06b4f4fee0f22c31a255d16900f8
|
|
BLAKE2b-256 checksum How to use checksums |
eafd612c96531b1c1d1c06e5d79547faea3f805785d67481b350f3f6a9cf6dc5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jan 19, 2026.
Transparency logRelease files / annotation_protocol-1.4.0-py3-none-any.whl
| Download URL | annotation_protocol-1.4.0-py3-none-any.whl |
|---|---|
| Size | 7.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6fc66f1506f015db16fdd50fad18520cbb126a7902b27257c9fa521eb5efec60
|
|
BLAKE2b-256 checksum How to use checksums |
258b71a5e1392dd3aca7ffeef0c3b10ea9b0e62959b5f39889702a06e11eda96
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jan 19, 2026.
Transparency log