Skip to main content

Improved, mypy-compatible duck typing with 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://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

Improved, mypy-compatible duck typing with Protocol.

Why?

PEP544 gave us Protocol, a way to define duck typing statically. In some cases, it’s still a bit cumbersome to work with. This library gives you some much needed niceties.

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

Partial protocols (🚧 work in progress 🚧)

What if you only need part of a protocol? Imagine we have several functions who use various properties of User. With partial protocols you can reuse a data ‘shape’ without requiring all attributes.

(exact syntax TBD)

from quacks import q

def determine_discount(u: User[q.id.is_premium]) -> int:
    ...  # access `id` and `is_premium` attributes

def greet(u: User[q.id.name]) -> None:
    ...  # access `id` and `name` attributes

u: User = ...

determine_discount(u)
greet(u)

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

quacks-0.1.1.tar.gz (4.4 kB view hashes)

Uploaded Source

Built Distribution

quacks-0.1.1-py3-none-any.whl (5.3 kB view hashes)

Uploaded Python 3

Supported by

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