Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

type_enforced

PyPI version Python Version License: MIT DOI PyPI Downloads

Fast where it counts, thorough where it matters. Runtime validation for Python type annotations. Zero dependencies and uncompromising performance.

type_enforced logo


Table of Contents


Quick Start

import type_enforced

# 1. Complete validation
@type_enforced.Enforcer
def greet(name: list[str], repeat: int = 1) -> str:
    return f"Hello {', '.join(name)}!" * repeat

greet(["Alice"], 2)       # Returns "Hello Alice!Hello Alice!"
greet(["Alice"], "twice")  # Raises TypeError at runtime!

# 2. Fast O(1) validation (does not check every item in passed collections)
@type_enforced.FastEnforcer
def process_tags(tags: list[str]) -> int:
    return len(tags)

process_tags(["admin", "user"])  # Returns 2
process_tags([123, "user"])       # Raises TypeError (first element is checked)

Enforce an entire module (complete or fast O(1) sampled validation):

import my_package
import type_enforced

# Enforce all functions and classes across my_package
type_enforced.ModuleEnforcer(my_package)

# Or for fast O(1) sampled validation across my_package:
# type_enforced.FastModuleEnforcer(my_package)

Why type_enforced?

Static type checkers (like mypy or pyright) catch errors during development, but offer zero protection at runtime against dynamic payloads, untyped API inputs, or user data.

Existing runtime type checkers force an unnecessary compromise:

  • Pydantic provides thorough validation, but comes with heavy runtime overhead and steep execution slowdowns.
  • Beartype achieves high speed primarily by taking shortcuts. It samples 1 element in collections and misses invalid items in unsampled data.

type_enforced eliminates this compromise:

  • Guaranteed Complete Validation: Validates every single item across large collections and nested data structures (e.g. list[dict[str, int]] or dicts with 10,000+ keys) by default, with zero shortcuts.
  • Fastest Full Validation: Delivers full, uncompromising validation at a fraction of other packages' overhead.
  • Fastest Sampled Validation: Need O(1) or logarithmic sampling for massive collections? This is how Beartype works. Set iterable_sample_pct='first', 'last', 'bookend', 'bookend_plus', 'log', 0 (random pick), or a percentage. Sampled validation in type_enforced runs up to ~15x faster than Beartype.
  • Zero Dependencies & Pure Python Compatible: Zero external runtime dependencies. Runs everywhere standard Python 3.11+ runs, with optional automatic C++ acceleration via nanobind when available.
  • Rich Type Support & Constraints: Seamlessly supports standard Python | unions, nested generics, Literals, Callables, Dataclasses, custom class inheritance, and custom validation Constraint rules.
  • Clean Tracebacks: Strips internal validation frames from tracebacks by default, pinpointing the exact line in your code that caused the issue.

Performance at a Glance

Timings represent the added differential validation time (enforced call time minus non-enforced baseline call time) in nanoseconds (ns), averaged over 100 runs when using the C++ backend. For full benchmarks see utils/benchmark.py and benchmark.md.

Type Size type_enforced (sample=1) Beartype (sample=1) Typeguard (sample=1) type_enforced (100%) Pydantic (100%) msgspec (100%) cattrs (100%) Typeguard (100%)
int — 10.5 ns 190.8 ns 1879.2 ns 10.6 ns 490.6 ns 264.4 ns 116.1 ns 1903.7 ns
Union[int, float] — 14.6 ns 214.5 ns 3903.9 ns 13.3 ns 536.8 ns 400.0 ns 426.0 ns 3905.0 ns
str — 10.5 ns 198.2 ns 1885.0 ns 10.6 ns 489.1 ns 263.5 ns 119.1 ns 1910.0 ns
list[int] 1 000 items 17.4 ns 335.2 ns 3221.6 ns 455.0 ns 11312.0 ns 5169.1 ns 48737.6 ns 1052411.9 ns
dict[str, int] 1 000 keys 39.7 ns 350.6 ns 4496.5 ns 3084.8 ns 40401.9 ns 26886.3 ns 68340.9 ns 2086004.8 ns
list[list[int]] 10 x 100 items 20.5 ns 376.4 ns 4438.1 ns 363.7 ns 11703.8 ns 5985.2 ns 48919.3 ns 1062224.5 ns
dict[str, list[int]] 10 x 100 items 42.4 ns 453.5 ns 5793.9 ns 412.2 ns 12182.7 ns 6494.8 ns 49395.8 ns 1072765.8 ns
list[dict[str, int]] 10 x 100 items 42.6 ns 444.6 ns 5728.2 ns 3494.7 ns 39740.2 ns 26101.5 ns 66918.9 ns 2145857.3 ns

Sampled Validation: When 1 sample validation is acceptable, type_enforced.FastEnforcer is up to ~15x faster than Beartype.

Full Validation: When full validation is required, type_enforced.Enforcer is up to ~40x faster than Pydantic on scalars and up to ~20x faster on larger data structures.


Installation

Install via pip:

pip install type_enforced

Or using uv:

uv add type_enforced

Requirements & Build Options

  • Python 3.11+

  • Zero Runtime Dependencies: Self-contained package with zero external runtime dependencies.

  • Pre-Built Binary Wheels: Pre-compiled wheels with C++ acceleration are published on PyPI for standard platforms (Linux, macOS, Windows).

  • Source Build & Automatic Fallback: If installing from source (pip install . or pip install --no-binary type_enforced type_enforced), type_enforced attempts to compile C++ extension modules via nanobind. If a C++ compiler is not present or compilation fails, it automatically falls back to pure-Python mode without failing the installation.

  • Force Pure-Python Mode (Skip C++ Build): To explicitly skip C++ compilation and install in pure-Python mode:

    Expand to show details on how to force pure-Python mode

    Environment Variable (CLI or CI):

    TYPE_ENFORCED_NO_BUILD=1 pip install type_enforced --no-binary type_enforced
    

    pip CLI (PEP 517 Config Setting):

    pip install type_enforced --no-binary type_enforced -Cwheel.cmake=false
    

    uv (in pyproject.toml):

    [tool.uv]
    no-binary-package = ["type-enforced"]
    config-settings-package = { type-enforced = { "wheel.cmake" = "false" } }
    

    pip (in requirements.txt):

    type_enforced --no-binary type_enforced --config-settings=wheel.cmake=false
    
    • Verify C++ Acceleration Status: Check whether C++ acceleration is active in the current environment:
    import type_enforced
    
    print(type_enforced.has_cpp())  # True if C++ acceleration is active, False for pure Python
    
Legacy Python Compatibility

For older Python versions, pin to legacy releases:

  • Python 3.10: pip install "type_enforced<=1.10.2"
  • Python 3.9: pip install "type_enforced<=1.9.0"
  • Python 3.7 – 3.8: pip install "type_enforced==0.0.16"

Usage Guide

1. Functions and Methods

Apply @type_enforced.Enforcer or @type_enforced.FastEnforcer to any callable. It validates positional arguments, keyword arguments, default parameters, and the return type.

import type_enforced

@type_enforced.Enforcer
def process_user(user_id: int, tags: list[str], active: bool = True) -> dict[str, str | int]:
    return {"user_id": user_id, "status": "active" if active else "inactive"}

# Passing invalid types raises a descriptive TypeError:
process_user("123", ["admin"])
# TypeError: TypeEnforced Exception (process_user): Type mismatch for typed variable `user_id`.
# Expected one of the following `[<class 'int'>]` but got `<class 'str'>` with value `123` instead.

2. Classes and Dataclasses

Decorating a class with @type_enforced.Enforcer or @type_enforced.FastEnforcer automatically enforces types on all annotated methods (including __init__, @classmethod, and @staticmethod):

import type_enforced
from dataclasses import dataclass

@type_enforced.Enforcer
class Account:
    def __init__(self, username: str, balance: float):
        self.username = username
        self.balance = balance

    def deposit(self, amount: float) -> float:
        self.balance += amount
        return self.balance

    @staticmethod
    def validate_code(code: str) -> bool:
        return len(code) == 6

# Dataclasses work seamlessly:
@type_enforced.Enforcer
@dataclass
class UserConfig:
    retries: int
    endpoint: str

To disable enforcement on a specific method within an enforced class:

@type_enforced.Enforcer
class Worker:
    def standard_job(self, task: str) -> None:
        pass

    @type_enforced.Enforcer(enabled=False)
    def high_throughput_job(self, data):
        # Type enforcement skipped for maximum throughput
        pass

3. Module-Level Enforcement (ModuleEnforcer or FastModuleEnforcer)

Enforce typing across an entire module in a single line without decorating every function and class individually:

# Place at the top of your module file (e.g., my_package/core.py)
import type_enforced

type_enforced.ModuleEnforcer()      # Complete validation across module
# Or for fast O(1) sampled validation across the module:
# type_enforced.FastModuleEnforcer()

def add(a: int, b: int) -> int:
    return a + b

class Helper:
    def run(self, flag: bool) -> str:
        return "ok" if flag else "failed"

You can also enforce an imported module:

import my_package
import type_enforced

type_enforced.ModuleEnforcer(my_package)
# Or: type_enforced.FastModuleEnforcer(my_package)

Note: By default, submodules=True, which recursively enforces all sub-packages/sub-modules in the same namespace (e.g. mypkg.submodule), while safely ignoring third-party and standard library imports.


Supported Type Annotations

type_enforced supports all standard Python 3.11+ typing constructs:

Standard Built-ins & Unions

@type_enforced.Enforcer
def fn(
    a: int,
    b: str | float,                    # Standard union syntax
    c: int | None = None,              # Optional syntax
) -> None:
    pass

Collections & Nested Generics

@type_enforced.Enforcer
def fn(
    items: list[int | float],
    mapping: dict[str, list[int]],      # Dicts require [KeyType, ValType]
    unique_ids: set[str],
    fixed_pair: tuple[str, int],        # Exact positional tuple: (str, int)
    var_tuple: tuple[int, ...],         # Variable-length tuple
) -> None:
    pass

Custom Classes & Subclass Inheritance

By default, subclasses pass type validation (e.g. Bar() satisfies Foo if class Bar(Foo)):

class Animal: pass
class Dog(Animal): pass
class Vehicle: pass

@type_enforced.Enforcer
def feed(animal: Animal) -> None:
    pass

feed(Animal())  # OK
feed(Dog())     # OK (subclasses allowed)
feed(Vehicle()) # Raises TypeError

To enforce uninitialized class objects (the class itself, rather than an instance), use type[Animal] (or typing.Type[Animal]):

@type_enforced.Enforcer
def make_instance(cls: type[Animal]) -> Animal:
    return cls()

Literals & Special Types

from typing import Literal, Callable, Sized, Any

@type_enforced.Enforcer
def fn(
    mode: Literal["read", "write"],        # Value check: must equal "read" or "write"
    handler: Callable,                     # Functions, methods, generators
    container: Sized,                      # list, dict, set, str, tuple, bytes, etc.
    wildcard: Any,                         # Permissive bypass
) -> None:
    pass
  • Stacking Literals: Literals combine with unions using OR logic (int | Literal['auto'] allows any int or the literal string 'auto').

Modern Typing Constructs (PEP Standards)

type_enforced comprehensively supports modern typing features from recent Python PEPs:

from typing import (
    Callable,
    LiteralString,
    Never,
    NewType,
    NoReturn,
    Self,
    TypeGuard,
    TypeIs,
    TypeVar,
    TypedDict,
)

# 1. PEP 673: typing.Self
class Builder:
    @type_enforced.Enforcer
    def set_name(self, name: str) -> Self:
        self.name = name
        return self

# 2. PEP 589: typing.TypedDict (validates required keys & field types)
class UserPayload(TypedDict):
    id: int
    name: str

@type_enforced.Enforcer
def create_user(payload: UserPayload) -> str:
    return payload["name"]

# 3. PEP 484: typing.NewType
UserId = NewType("UserId", int)

@type_enforced.Enforcer
def get_user(user_id: UserId) -> None:
    pass

# 4. Subscripted Callables (PEP 484 & PEP 612)
@type_enforced.Enforcer
def apply_handler(callback: Callable[[int, str], bool]) -> None:
    pass

# 5. PEP 675: typing.LiteralString
@type_enforced.Enforcer
def run_query(sql: LiteralString) -> None:
    pass

# 6. PEP 484 / PEP 654: NoReturn and Never
@type_enforced.Enforcer
def terminate() -> NoReturn:
    raise SystemExit(0)

# 7. PEP 647 & PEP 742: TypeGuard and TypeIs
@type_enforced.Enforcer
def is_str_list(val: list[object]) -> TypeGuard[list[str]]:
    return all(isinstance(x, str) for x in val)

# 8. TypeVar, ParamSpec, TypeVarTuple & PEP 695 (Python 3.12+)
T = TypeVar("T", bound=int | float)

@type_enforced.Enforcer
def scale(val: T, factor: float) -> float:
    return val * factor

Collection & Nested Type Unions

Unions of collection types are evaluated per-variant, enforcing that each container strictly satisfies one schema rather than allowing mixed elements:

@type_enforced.Enforcer
def process_data(
    coords: tuple[int, str] | tuple[str, int],
    lookup: dict[str, list[int]] | dict[str, int],
    tags: list[int] | list[str],
) -> None:
    pass

# Distinct collection schemas match:
process_data((1, "north"), {"a": [1, 2]}, [1, 2, 3])  # OK
process_data(("north", 1), {"a": 10}, ["a", "b"])  # OK

# Mixed invalid structures fail:
process_data((1, 1), {"a": 10}, [1, 2])  # Raises TypeError for coords
process_data(
    (1, "north"), {"a": 1, "b": [2]}, [1, 2]
)  # Raises TypeError for lookup
process_data((1, "north"), {"a": 10}, [1, "two"])  # Raises TypeError for tags

Variadic Positional & Keyword Arguments

*args and **kwargs are fully supported with clear, indexed error messages:

@type_enforced.Enforcer
def configure(*flags: str, **settings: int | bool) -> None:
    pass

configure("verbose", "debug", timeout=30, dry_run=True)  # OK
configure("verbose", 123)  # Raises TypeError: Type mismatch for typed variable `flags[1]`
configure(timeout="30s")   # Raises TypeError: Type mismatch for typed variable `settings['timeout']`

Known Limitations / Currently Unsupported

  • Generic parameterization of Sized (e.g. Sized[int] — use Sized without inner type arguments)

Value Validation with Constraints

type_enforced allows post-type-check value constraints directly in type annotations.

Built-in Constraint

Validate bounds, numeric comparisons, string patterns (regex), and inclusion/exclusion:

import type_enforced
from type_enforced.utils import Constraint

@type_enforced.Enforcer
def set_score(
    score: int | Constraint(ge=0, le=100),
    code: str | Constraint(pattern=r"^[A-Z]{3}[0-9]{4}$"),
) -> bool:
    return True

set_score(85, "ABC1234")    # Passes
set_score(105, "ABC1234")   # Raises TypeError (Constraint `Less Than Or Equal To (100)` not met)
set_score(85, "invalid")    # Raises TypeError (Constraint `Regex Pattern Match` not met)

Available Constraint parameters:

  • gt, lt, ge, le, eq, ne (numeric / comparison bounds)
  • pattern (regular expression string match)
  • includes, excludes (membership checks)

Custom GenericConstraint

Write arbitrary validation logic using custom predicates:

import type_enforced
from type_enforced.utils import GenericConstraint

RGBColor = str | GenericConstraint({
    "valid_hex_color": lambda c: c.startswith("#") and len(c) in (4, 7)
})

@type_enforced.Enforcer
def render(color: RGBColor) -> None:
    pass

render("#ffffff")  # Passes
render("red")      # Raises TypeError (Constraint `valid_hex_color` not met)

Note: Constraints are evaluated after type checking. Constraints stack with unions: int | Constraint(ge=0) | Constraint(le=10).


Configuration Reference

@Enforcer, @FastEnforcer, ModuleEnforcer, and FastModuleEnforcer accept the following configuration arguments:

Parameter Type Default Description
enabled bool True Toggle enforcement. Set False to bypass type checks (useful for production vs. debugging or per-method overrides).
strict bool True When True, raises TypeError on mismatch. When False, logs a warning to the console instead of raising.
clean_traceback bool True Filters internal type_enforced stack frames so unhandled tracebacks point directly to user code (see note below).
iterable_sample_pct int, float, or str 100 ('first' for Fast*) Sampling mode or percentage (0–100) of iterable items to validate. 'first' checks the first item, 'last' checks the last item (or first item for dicts/sets), 'bookend' checks first and last items (first 2 items for dicts/sets), 'bookend_plus' checks first, last, and a random middle item (first 2 items and 1 random item for dicts/sets), 'log' checks a sample of ceil(log2(n)) items using a pseudo-random start offset and even steps across sequences (first ceil(log2(n)) items for dicts/sets), 0 checks 1 random item, and 1..100 checks the specified percentage (rounding up) starting at a pseudo-random offset within each step interval for sequences (first $N$ items for dicts/sets). 100 validates all elements. Note: FastEnforcer and FastModuleEnforcer strictly accept 'first', 'last', 'bookend', 'bookend_plus', 'log', or 0.
only_typed bool False When True, raises an exception upon decoration if any parameter or return value lacks a type hint.
submodules (ModuleEnforcers only) bool True Recursively enforces all sub-packages/sub-modules in the same namespace.

Configuration Options in Depth

1. Strict Typing Mode (only_typed=True)

To catch unannotated parameters or missing return annotations across your codebase, enable only_typed=True. This raises a TypeError at definition time if any parameter (excluding self/cls) or the return type lacks an annotation:

import type_enforced

@type_enforced.Enforcer(only_typed=True)
def calculate(a: int, b: int) -> int:
    return a + b

# Missing annotation on parameter `b` or missing return annotation raises immediately:
@type_enforced.Enforcer(only_typed=True)
def invalid_fn(a: int, b):
    return a
# TypeError: TypeEnforced Exception (invalid_fn): Untyped variable `b` found in function/method `invalid_fn`.

2. Warning Mode (strict=False)

Print warnings to the console instead of raising exceptions (useful for gradual adoption or debugging without breaking execution):

@type_enforced.Enforcer(strict=False)
def lenient_fn(x: int) -> int:
    return x

lenient_fn("not_an_int")
# Logs: TypeEnforced Warning (lenient_fn): Type mismatch for typed variable `x`...
# Returns "not_an_int" without raising an exception.

3. Clean Tracebacks (clean_traceback=True)

By default, clean_traceback=True temporarily hooks sys.excepthook when a type exception is raised, stripping internal type_enforced library frames so that unhandled script tracebacks point directly to the line of user code that caused the issue.

Note on Interactive Terminals / REPLs: In interactive environments (such as the Python REPL / PyREPL, IPython, or Jupyter notebooks), the shell wraps execution in an internal try...except loop and catches exceptions before they reach sys.excepthook. Consequently, interactive terminal sessions will still display the full traceback.

4. Sampled Validation (FastEnforcer, FastModuleEnforcer, iterable_sample_pct)

For large or performance-critical collections, use @type_enforced.FastEnforcer or configure sampling instead of full iteration:

  • 'first' (default for FastEnforcer / FastModuleEnforcer): Validates the first element in O(1) time (runs up to ~15x faster than Beartype).
  • 'last': Validates the last element in O(1) time for indexable sequences (list, tuple). For non-indexed collections like dict and set, 'last' validates the first item to avoid reverse iteration and hash table lookup overhead.
  • 'bookend': Validates the first and last elements in O(1) time for sequences (the first 2 items for dict and set).
  • 'bookend_plus': Validates the first, last, and a random middle element in O(1) time for sequences (the first 2 items and 1 random item for dict and set).
  • 'log': For sequences (list, tuple), samples ceil(log2(n)) items by picking a Weyl pseudo-random start offset and taking even step jumps across the collection. For dict and set, validates the first ceil(log2(n)) items.
  • 0: Validates one element chosen at random.
  • 1..99 (int, Enforcer / ModuleEnforcer only): Validates the specified percentage of items (rounding up). For sequences, selects a Weyl pseudo-random start offset in [0, step - 1] and takes even step jumps across the collection, giving every index an equal probability of being checked. For dict and set, validates the first N items.
  • 100: Complete validation of all items across the collection.
# Using FastEnforcer directly:
@type_enforced.FastEnforcer
def fast_check(items: list[int]) -> int:
    return len(items)

fast_check([1, 2, 3])           # OK
fast_check(["bad_first", 2, 3])  # Raises TypeError

# Or configure Enforcer with a specific sample mode:
@type_enforced.Enforcer(iterable_sample_pct="last")
def check_last(items: list[int]) -> int:
    return len(items)

Production Best Practices

Multi-Threaded Services & Web Frameworks (clean_traceback=False)

By default, clean_traceback=True temporarily hooks sys.excepthook to filter internal library frames for standalone scripts. In concurrent multi-threaded environments and applications using centralized error handlers, consider setting clean_traceback=False:

import type_enforced

@type_enforced.Enforcer(clean_traceback=False)
def process_request(user_id: int, tags: list[str]) -> dict:
    return {"user_id": user_id, "tags": tags}

Contributing

Contributions are welcome!

Development Setup

We use uv for dependency management and testing in a Unix-based environment (Linux, macOS, or WSL2 on Windows).

# Clone the repository
git clone https://github.com/connor-makowski/type_enforced.git
cd type_enforced

# Install dev dependencies
uv sync --extra dev

Development Commands

Command Description
uv run pytest Run tests in local environment
uv run pytest -v Run tests with verbose output
uv run nox Run test suite across Python 3.11–3.14 (C++ and pure-Python fallback)
uv run nox -s tests-3.14 Run test suite on a specific Python version
uv run python utils/minibench.py Run quick performance at a glance benchmark
uv run python utils/cpp_vs_python_bench.py Run C++ accelerated vs pure Python benchmark
uv run python utils/prettify.py Auto-format with autoflake and black (80 col)

Guidelines

  1. Fork the repo and create your branch from main.
  2. Ensure all tests pass across versions (uv run nox).
  3. Format code before committing (uv run python utils/prettify.py).
  4. Keep commits atomic and clearly described.
  5. Submit a pull request.

Academic Citation

If you use type_enforced in academic research, please cite our JOSS paper:

@article{Makowski2026,
  doi = {10.21105/joss.08832},
  url = {https://doi.org/10.21105/joss.08832},
  year = {2026},
  publisher = {The Open Journal},
  volume = {11},
  number = {118},
  pages = {8832},
  author = {Connor Makowski},
  title = {type_enforced: A pure Python runtime type enforcer},
  journal = {Journal of Open Source Software}
}

License

Distributed under the MIT License. See LICENSE for details.

Metadata

Release files for type-enforced 2.13.0b1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for type-enforced 2.13.0b1
File Size Uploaded
type_enforced-2.13.0b1.tar.gz 65.0 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for type-enforced 2.13.0b1
File
type_enforced-2.13.0b1-cp314-cp314-win_arm64.whl CPython 3.14 CPython 3.14 Windows ARM64 Details
type_enforced-2.13.0b1-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
type_enforced-2.13.0b1-cp314-cp314-musllinux_1_2_x86_64.whl CPython 3.14 CPython 3.14 Linux musl 1.2+ x86-64 Details
type_enforced-2.13.0b1-cp314-cp314-musllinux_1_2_aarch64.whl CPython 3.14 CPython 3.14 Linux musl 1.2+ ARM64 Details
type_enforced-2.13.0b1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
type_enforced-2.13.0b1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ ARM64, Linux glibc 2.26+ ARM64 Details
type_enforced-2.13.0b1-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details
type_enforced-2.13.0b1-cp313-cp313-win_arm64.whl CPython 3.13 CPython 3.13 Windows ARM64 Details
type_enforced-2.13.0b1-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
type_enforced-2.13.0b1-cp313-cp313-musllinux_1_2_x86_64.whl CPython 3.13 CPython 3.13 Linux musl 1.2+ x86-64 Details
type_enforced-2.13.0b1-cp313-cp313-musllinux_1_2_aarch64.whl CPython 3.13 CPython 3.13 Linux musl 1.2+ ARM64 Details
type_enforced-2.13.0b1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
type_enforced-2.13.0b1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl CPython 3.13 CPython 3.13 Linux glibc 2.26+ ARM64, Linux glibc 2.28+ ARM64 Details
type_enforced-2.13.0b1-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
type_enforced-2.13.0b1-cp312-cp312-win_arm64.whl CPython 3.12 CPython 3.12 Windows ARM64 Details
type_enforced-2.13.0b1-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
type_enforced-2.13.0b1-cp312-cp312-musllinux_1_2_x86_64.whl CPython 3.12 CPython 3.12 Linux musl 1.2+ x86-64 Details
type_enforced-2.13.0b1-cp312-cp312-musllinux_1_2_aarch64.whl CPython 3.12 CPython 3.12 Linux musl 1.2+ ARM64 Details
type_enforced-2.13.0b1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
type_enforced-2.13.0b1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ ARM64, Linux glibc 2.26+ ARM64 Details
type_enforced-2.13.0b1-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
type_enforced-2.13.0b1-cp311-cp311-win_arm64.whl CPython 3.11 CPython 3.11 Windows ARM64 Details
type_enforced-2.13.0b1-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
type_enforced-2.13.0b1-cp311-cp311-musllinux_1_2_x86_64.whl CPython 3.11 CPython 3.11 Linux musl 1.2+ x86-64 Details
type_enforced-2.13.0b1-cp311-cp311-musllinux_1_2_aarch64.whl CPython 3.11 CPython 3.11 Linux musl 1.2+ ARM64 Details
type_enforced-2.13.0b1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
type_enforced-2.13.0b1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ ARM64, Linux glibc 2.26+ ARM64 Details
type_enforced-2.13.0b1-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details

Total release size: 5.3 MB

Release files / type_enforced-2.13.0b1.tar.gz

Download URL type_enforced-2.13.0b1.tar.gz
Size 65.0 kB
Tags Source
SHA-256 checksum
How to use checksums
dab75e22866fb02f2d1e8cc29a8b5d0cb578ca59eedcff5190409e4ebdfdf137
BLAKE2b-256 checksum
How to use checksums
527cd56a0b162246d4f344e6f3ce0e9b9efd2af64774faaee514f31342bbde94
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp314-cp314-win_arm64.whl

Download URL type_enforced-2.13.0b1-cp314-cp314-win_arm64.whl
Size 179.8 kB
Tags CPython 3.14 Windows ARM64
SHA-256 checksum
How to use checksums
137a93b258db89b62758e9df8769d1311465c0b3d0bbd93cd2668de401a0b3b3
BLAKE2b-256 checksum
How to use checksums
b10edfd949f81c91cf695238d27b3184af8adbdd30deda3ddef1fb0654759958
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp314-cp314-win_amd64.whl

Download URL type_enforced-2.13.0b1-cp314-cp314-win_amd64.whl
Size 182.6 kB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
7867978650b11c8ecf5f9e1602a8a59774a1cca2524642d2298f8deb7b5906ef
BLAKE2b-256 checksum
How to use checksums
ac1597c78e7556f66bfe24e7f72cc812bdf4fc857423a50e6d13bb4f385bb1a8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp314-cp314-musllinux_1_2_x86_64.whl

Download URL type_enforced-2.13.0b1-cp314-cp314-musllinux_1_2_x86_64.whl
Size 252.4 kB
Tags CPython 3.14 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
c0cc9fa50e8fee886d1e2c459e29a295a366005a77305c40627d5e5f1512a6ce
BLAKE2b-256 checksum
How to use checksums
cde93c3ac838730ec6f228335ea2d0380a09dbb6ed8c4f6fa4b4708880d2da9c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp314-cp314-musllinux_1_2_aarch64.whl

Download URL type_enforced-2.13.0b1-cp314-cp314-musllinux_1_2_aarch64.whl
Size 245.9 kB
Tags CPython 3.14 Linux musl 1.2+ ARM64
SHA-256 checksum
How to use checksums
822461fb3a7afdf52264d5da9cbc635ac4c3a5b7903ba0634314e5dbe1f35c38
BLAKE2b-256 checksum
How to use checksums
729dade67388bac58244c57ac6a0960a5b4d4c752e3ab3fbf3bd74d829109d82
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL type_enforced-2.13.0b1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 152.8 kB
Tags CPython 3.14 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
d332001aa084dd537340d97454c8baeea47d722c86817d1245acdbb47e72ba78
BLAKE2b-256 checksum
How to use checksums
cb55ad280f57d10cc46086e114d288b383071533f38e27c79ae37de4d4d5fa19
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl

Download URL type_enforced-2.13.0b1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Size 148.7 kB
Tags CPython 3.14 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
ba1606c11a5e3860c7c9bfdc2990172bb0adf4b945c259f6501e4af45903dfc2
BLAKE2b-256 checksum
How to use checksums
e56e836a9f822748c0fa2f9b8fd3f05a003ddc1ccf5e272667a694cd44f113d2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp314-cp314-macosx_11_0_arm64.whl

Download URL type_enforced-2.13.0b1-cp314-cp314-macosx_11_0_arm64.whl
Size 145.2 kB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
daa307b26964af57ac266769d0f3fe351b0ae61ec162cc436f92c931af2c3fe3
BLAKE2b-256 checksum
How to use checksums
be8f3fd65e58f44dff6dec21b11686a81fafd68683474a20fa7ed6c5d0f60160
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp313-cp313-win_arm64.whl

Download URL type_enforced-2.13.0b1-cp313-cp313-win_arm64.whl
Size 176.8 kB
Tags CPython 3.13 Windows ARM64
SHA-256 checksum
How to use checksums
1f374370715d97093290e203df57c3cef20a6e2327d159b77b2880beb68b6b83
BLAKE2b-256 checksum
How to use checksums
dbf3f9d4debdce3a205cad4d976a7cf2006421d6a71959ba300b90bba12d2fa8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp313-cp313-win_amd64.whl

Download URL type_enforced-2.13.0b1-cp313-cp313-win_amd64.whl
Size 179.9 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
871ce10c7880a21ff52d4725b00c9fa5a576def2731e86bf786dce3bd793e1c1
BLAKE2b-256 checksum
How to use checksums
e74abf020befaba98c63cd6851240eb99f6fbc22ef833565b7c763ba6120191e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp313-cp313-musllinux_1_2_x86_64.whl

Download URL type_enforced-2.13.0b1-cp313-cp313-musllinux_1_2_x86_64.whl
Size 252.2 kB
Tags CPython 3.13 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
b6b83af7440db2479d7484b04cbc53be0308924dfa933d5f7fef2922b73dec89
BLAKE2b-256 checksum
How to use checksums
746cf79dca9c4b802268b4a0985756f98e2bd377985b0a19697c65a6cdac6ab0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp313-cp313-musllinux_1_2_aarch64.whl

Download URL type_enforced-2.13.0b1-cp313-cp313-musllinux_1_2_aarch64.whl
Size 245.9 kB
Tags CPython 3.13 Linux musl 1.2+ ARM64
SHA-256 checksum
How to use checksums
0222ca48d262d6611e760559d3cdc32b15b91d14479dd05afc731e28abd23c22
BLAKE2b-256 checksum
How to use checksums
06116221d4a3680afd2490a47fc519c7480e733c221dd4a9eb63a73a528d90f3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL type_enforced-2.13.0b1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 152.6 kB
Tags CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
733c6f899d6a35f047f46621aa0a085a18bff303a305c268cea53e218628191b
BLAKE2b-256 checksum
How to use checksums
bbc07150a5250e7489a5ac1d14561931d96680bd98e40e4d7d95b36b8da4c32e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl

Download URL type_enforced-2.13.0b1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Size 148.7 kB
Tags CPython 3.13 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
92c991841ba2aa4512e5ebd965b47ca635224488f8befa542fe8780586f13a1b
BLAKE2b-256 checksum
How to use checksums
f6a94266dba4911192ea76f6795df63d1e065b4d1bfc4520d11149ae3f534a19
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp313-cp313-macosx_11_0_arm64.whl

Download URL type_enforced-2.13.0b1-cp313-cp313-macosx_11_0_arm64.whl
Size 144.8 kB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
6618abcdda52c26d582e6522f41d61629ad09dd86bb007e087f7e564e79dc832
BLAKE2b-256 checksum
How to use checksums
f3cb0eea440f5ac8276ae7f40b27308c97dcb120efa1fd24c3ef1f570ec3e66d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp312-cp312-win_arm64.whl

Download URL type_enforced-2.13.0b1-cp312-cp312-win_arm64.whl
Size 176.7 kB
Tags CPython 3.12 Windows ARM64
SHA-256 checksum
How to use checksums
81cafa7b34f6bb4e28d91ecdcf8659979264dc1de9f76ef5e95ed309520647d5
BLAKE2b-256 checksum
How to use checksums
9dad02e13860c38405a4c7807df9c92968b88c95eae0ede1b80c4fdb07b21069
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp312-cp312-win_amd64.whl

Download URL type_enforced-2.13.0b1-cp312-cp312-win_amd64.whl
Size 179.9 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
e48128220d354fee57724e57dbe3f55758d6f96ae69233fdef34679e4aebf4ef
BLAKE2b-256 checksum
How to use checksums
aad822fe8cbccd2ff673bd78f41fd19c0add121109a3e20cb65f2b4693d340c0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp312-cp312-musllinux_1_2_x86_64.whl

Download URL type_enforced-2.13.0b1-cp312-cp312-musllinux_1_2_x86_64.whl
Size 252.3 kB
Tags CPython 3.12 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
f06826889da574a980991dbd984b50675dba5dd0e1c10693d610323c8623aafd
BLAKE2b-256 checksum
How to use checksums
2a78a5ce72e4babde6ce14542a53814ff675e6bc8d16d17322320f81c81fdb1b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp312-cp312-musllinux_1_2_aarch64.whl

Download URL type_enforced-2.13.0b1-cp312-cp312-musllinux_1_2_aarch64.whl
Size 245.9 kB
Tags CPython 3.12 Linux musl 1.2+ ARM64
SHA-256 checksum
How to use checksums
782d2a3a06173572bd71e3dbffe028c8670cb99a48a635c8fd8c2b341f9d7a23
BLAKE2b-256 checksum
How to use checksums
655277519b5810dc894908f382f0f44af4bb18763b77e28292ec0b959b063c80
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL type_enforced-2.13.0b1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 152.8 kB
Tags CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
2ed1dc09130a4120b8820ab524ac109456af3b74c8eaabce018060749face26d
BLAKE2b-256 checksum
How to use checksums
a608cc5e820cfff6038b9772f2b5db6463255069c4fde0485dd083c3f189abb8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl

Download URL type_enforced-2.13.0b1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Size 148.7 kB
Tags CPython 3.12 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
880e6c9a0e246e1fd6a03b470d76854700e11a829557e157dc47310992ff8ac6
BLAKE2b-256 checksum
How to use checksums
e12246b0679d3252570846335fe1faf134acf46cb1f33ca47367120603afa3ec
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp312-cp312-macosx_11_0_arm64.whl

Download URL type_enforced-2.13.0b1-cp312-cp312-macosx_11_0_arm64.whl
Size 144.8 kB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
abc359828e3bb075c4eb94f89c48eaee56e8fd69209be22d63c505f53594610f
BLAKE2b-256 checksum
How to use checksums
51d3afe988ec9e3e7df601c2464ce9baa2ee62024c0e0e06068a860fbe6b8a44
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp311-cp311-win_arm64.whl

Download URL type_enforced-2.13.0b1-cp311-cp311-win_arm64.whl
Size 177.7 kB
Tags CPython 3.11 Windows ARM64
SHA-256 checksum
How to use checksums
dfa5c33116250120b6bbde8e8ef6202efea026cc3af9a73140ccd4a287db594a
BLAKE2b-256 checksum
How to use checksums
9d67c1dcd6fd4f388761d1e0a4c7d888725a6680274e92908b86a117b5bed9ab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp311-cp311-win_amd64.whl

Download URL type_enforced-2.13.0b1-cp311-cp311-win_amd64.whl
Size 180.0 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
a9da740f991fa7be34ef658bbdeaabd9f6d2d85683f5c4fa16e6ed009d607496
BLAKE2b-256 checksum
How to use checksums
bb867c8936bb1c1c3d61a1d6e42abf007292b284f0f0c32208d9316f7c9f3951
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp311-cp311-musllinux_1_2_x86_64.whl

Download URL type_enforced-2.13.0b1-cp311-cp311-musllinux_1_2_x86_64.whl
Size 252.7 kB
Tags CPython 3.11 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
2c211a80131773d0fc9537fdbe89afa0b08abd299d5970ced9159f78e8a8ebd0
BLAKE2b-256 checksum
How to use checksums
a3746d638edee70e418c41469f73a54b754a04b71ab13da38dd8482c29a2b14e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp311-cp311-musllinux_1_2_aarch64.whl

Download URL type_enforced-2.13.0b1-cp311-cp311-musllinux_1_2_aarch64.whl
Size 246.0 kB
Tags CPython 3.11 Linux musl 1.2+ ARM64
SHA-256 checksum
How to use checksums
baee64b75ec04bffb34306cbe9c03b329812382184ce16c9757cc475c0597b2e
BLAKE2b-256 checksum
How to use checksums
c81fde2d54f0a015761cff94ea3313eacbc90ecbd8e0686ae5cbc094c4d2c6b9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL type_enforced-2.13.0b1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 153.0 kB
Tags CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
5b715deeddafc58f18990ca113e7130d1826e19f645c9a3573aa0707d65d64f8
BLAKE2b-256 checksum
How to use checksums
49b9ad49a7ad814384d1c3d107f016ad8084a66f9b34c9e1947986c39f0df4c6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl

Download URL type_enforced-2.13.0b1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Size 148.9 kB
Tags CPython 3.11 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
f9d0ba36cef36a03aa7d654a0f86f703d0556adeb7817c38dfa4595c95b9f534
BLAKE2b-256 checksum
How to use checksums
76c7c9358a8c73414ba8a1ab9b01aa3640aa7f642c9ac8848c2240859f8bb017
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / type_enforced-2.13.0b1-cp311-cp311-macosx_11_0_arm64.whl

Download URL type_enforced-2.13.0b1-cp311-cp311-macosx_11_0_arm64.whl
Size 145.8 kB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
0d78e6307849c32e52dcf457da1b0cb630bd7a2f20f4a15621a2678ae0ea44e2
BLAKE2b-256 checksum
How to use checksums
04224c233b52cdba86027bbd0250549a1b75e6c1aefb34d029c77692c198c89f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release history Release notifications | RSS feed

This release

2.13.0b1 This release

29 release files

2.12.3

1 release file

2.12.2

1 release file

2.12.1

1 release file

2.12.0

1 release file

2.11.0

1 release file

2.10.1

1 release file

2.10.0

1 release file

2.9.0

1 release file

2.8.1

2 release files

2.8.0

2 release files

2.7.0

2 release files

2.6.0

2 release files

2.5.0

2 release files

2.4.0

2 release files

2.3.0

2 release files

2.2.3

2 release files

2.2.2

2 release files

2.2.1

2 release files

2.2.0

2 release files

2.1.0

2 release files

2.0.0

2 release files

1.10.1

2 release files

1.10.0

2 release files

1.9.0

2 release files

1.8.1

2 release files

1.8.0

2 release files

1.7.0

2 release files

1.6.0

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.0.16

1 release file

0.0.15

1 release file

0.0.14

1 release file

0.0.13

1 release file

0.0.12

1 release file

0.0.11

1 release file

0.0.10

1 release file

0.0.9

1 release file

0.0.8

1 release file

0.0.7

1 release file

0.0.6

1 release file

0.0.5

1 release file

0.0.4

1 release file

0.0.3

1 release file

0.0.2

1 release file

0.0.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page