Skip to main content

Annotation protocol to allow very thorough isinstance checks.

Project description

annotation-protocol

The AnnotationProtocol allows for more thorough isinstance checks in python. Specifically, it adds the following functionality beyond typing.Protocol.

  1. Check that all attributes from the class other that should adhere to the protocol are present in it.
  2. Attributes, input arguments and return arguments need ot have the same type annotations between protocol and other.

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

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

annotation_protocol-1.4.0.tar.gz (8.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

annotation_protocol-1.4.0-py3-none-any.whl (7.8 kB view details)

Uploaded Python 3

File details

Details for the file annotation_protocol-1.4.0.tar.gz.

File metadata

  • Download URL: annotation_protocol-1.4.0.tar.gz
  • Upload date:
  • Size: 8.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for annotation_protocol-1.4.0.tar.gz
Algorithm Hash digest
SHA256 15d846a4984339bab6cbf80a44623219b8cb06b4f4fee0f22c31a255d16900f8
MD5 8d4325c6497ee9d858777a063e1fb066
BLAKE2b-256 eafd612c96531b1c1d1c06e5d79547faea3f805785d67481b350f3f6a9cf6dc5

See more details on using hashes here.

Provenance

The following attestation bundles were made for annotation_protocol-1.4.0.tar.gz:

Publisher: publish-to-pypi.yml on RoyalHaskoningDHV/annotation-protocol

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file annotation_protocol-1.4.0-py3-none-any.whl.

File metadata

File hashes

Hashes for annotation_protocol-1.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6fc66f1506f015db16fdd50fad18520cbb126a7902b27257c9fa521eb5efec60
MD5 992e15c03c1af2486e0c1383538eef5c
BLAKE2b-256 258b71a5e1392dd3aca7ffeef0c3b10ea9b0e62959b5f39889702a06e11eda96

See more details on using hashes here.

Provenance

The following attestation bundles were made for annotation_protocol-1.4.0-py3-none-any.whl:

Publisher: publish-to-pypi.yml on RoyalHaskoningDHV/annotation-protocol

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page