Skip to main content

Better duck-typing with mypy-compatible extensions to Protocol

Project description

https://img.shields.io/pypi/v/quacks.svg https://img.shields.io/pypi/l/quacks.svg https://img.shields.io/pypi/pyversions/quacks.svg https://github.com/ariebovenberg/quacks/actions/workflows/build.yml/badge.svg https://img.shields.io/readthedocs/quacks.svg https://img.shields.io/badge/code%20style-black-000000.svg

If it walks like a duck and it quacks like a duck, then it must be a duck

Thanks to PEP544, Python now has protocols: a way to define duck typing statically. This library gives you some niceties to make common idioms easier.

Installation

pip install quacks

⚠️ For type checking to work with mypy, you’ll need to enable the plugin in your mypy config file:

[mypy]
plugins = quacks

Features

Easy read-only protocols

Defining read-only protocols is great for encouraging immutability and working with frozen dataclasses. Use the readonly decorator:

from quacks import readonly

@readonly
class User(Protocol):
    id: int
    name: str
    is_premium: bool

Without this decorator, we’d have to write quite a lot of cruft, reducing readability:

class User(Protocol):
    @property
    def id(self) -> int: ...
    @property
    def name(self) -> str: ...
    @property
    def is_premium(self) -> bool: ...

Supported by

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