Skip to main content

python-constricter

EXPERIMENTAL UNTIL v1.0.0

I want all of my python code typed.

CI Security PyPI Python OpenSSF Scorecard Test coverage: 100% Annotations: 100% License: MIT

Lint rules: every local variable is typed where it's first bound. Ships as a flake8 plugin, a pylint plugin and a standalone command (for ruff, which loads no plugins).

            /^\/^\
          _|__|  O|
\/     /~     \_/ \
  \____|__________/  \
        \_______      \
                `\     \                 \
                  |     |                  \
                  /      /                    \
                /     /                       \\
              /      /                         \ \
              /     /                            \  \
            /     /             _----_            \   \
          /     /           _-~      ~-_         |   |
          (      (        _-~    _--_    ~-_     _/   |
          \      ~-____-~    _-~    ~-_    ~-_-~    /
            ~-_           _-~          ~-_       _-~
                ~--______-~                ~-___-~

def total(items: list[int]) -> int:
    count = 0  # LVA001
    result: int = 0  # ok
    first, *rest = items  # LVA001 twice
    head: int
    tail: list[int]
    head, *tail = items  # ok: declared first
    if (n := len(items)) > 3:  # LVA001
        result = n  # ok: rebinding
    for item in items:  # LVA002
        result += item
    for other in items:  # type: int  # LVA003
        result += other
    value: int
    for value in items:  # ok: declared first
        result += value
    return result

Rules

Checked per function body, including methods and nested functions; with all-scopes, module and class bodies too. Statements are read in source order, and only a name's first binding counts (LVA008–LVA010 aside, which read every one).

Code Reports Fix
LVA001 =, unpacking, := or with ... as in a function without annotation name: T = ..., or name: T first
LVA002 an untyped for target or match capture name: T first (or a type comment)
LVA003 a for target typed only by # type: T name: T first
LVA004 with all-scopes: the same as LVA001, in a module or class body name: T = ... (ClassVar[T] in a dataclass)
LVA005 an annotation with Any, object or a generic without its parameters, past vague name the real type
LVA006 an annotation nested nesting deep (3 by default) a type alias for a part of it
LVA007 a name annotated again with the type it already has, in the same block drop the second annotation
LVA008 with every value the name ever holds known: an annotation that could narrow to them narrow it (total: int)
LVA009 a value, anywhere in the name's lifetime, whose type doesn't fit its annotation fix the value, or widen the annotation
LVA010 with every value known: a union member no value is drop the member
LVA011 an annotation listing a fixed-length tuple of more than max-length types (4 by default) name the fields (a NamedTuple, a dataclass)
LVA012 opt-in: a local bound once, outside any loop, and never rebound name: Final = ...

Exempt: comprehensions, except ... as, imports, def/class, type aliases, parameters, global/nonlocal, and _; in module and class bodies, dunder names (__all__, __slots__) and enum members (a base imported from enum, however it's aliased, or else whose name ends in Enum or Flag). And what makes a type, not a value, which an annotation would turn into a variable to a type checker: T = TypeVar("T"), a ParamSpec, a TypeVarTuple, a NewType, and a functional NamedTuple, TypedDict, Enum or collections.namedtuple, however typing, typing_extensions, enum or collections is imported.

A # type: comment (x = 1 # type: int, with f() as x: # type: T) counts as an annotation with type-comments, or automatically in a module written to run on Python 2: one that imports print_function, unicode_literals, absolute_import, division, with_statement, generators or nested_scopes from __future__.

LVA007 compares a block on its own: an if's body and its orelse, a try's body and its excepts, and the like, are different blocks, since they don't both run in the same pass.

LVA009 checks every binding of an annotated name (or parameter) in the scope, wherever and in whatever order they run, but only one whose value's type --fix would infer with certainty, and only against types whose every subclass is known: builtins, and classes the module defines on such bases. An imported class, a protocol or an alias is never compared, builtin containers are compared by the container alone (flags: tuple[str, ...] = ("-q",) fits), a copy of a union-typed name is skipped (an is None check may have narrowed it), and so is a name annotated only under if TYPE_CHECKING:. It has no --fix.

LVA008 and LVA010 also need every binding's value known (one unknown call, loop target or unpacking and the name could hold anything), and are only claimed for a function's own names: a module or class variable is state other code rebinds out of sight (mod.X = ..., self.x = ..., monkeypatch), and a nonlocal write from a nested function counts as unknown too. Neither has a --fix: --fix adds annotations, it doesn't rewrite them.

Levels

Each level makes one more code an error. The rest are warnings: the CLI prints them (as ::warning or SARIF warning in those formats) but exits 0; flake8 and pylint report errors only.

Level Errors Warnings
relaxed / 0 none LVA001–LVA004, LVA007, LVA009
strict / 1 LVA001, LVA004 (the default) LVA002, LVA003, LVA005–LVA007, LVA009, LVA011
constrict / 2 LVA001, LVA004, LVA002, LVA009 LVA003, LVA005–LVA008, LVA010, LVA011
suffocate / 3 all none

LVA005, LVA006 and LVA011 aren't reported at relaxed; LVA008 and LVA010 only from constrict. LVA012 is opt-in, reported only when selected by its full code (--extend-select LVA012, flake8's extend-select = LVA012, pylint's enable = could-be-final), at every level, and an error only at suffocate: on the corpus, 45–70% of every codebase's first bindings qualify, so it suits a codebase that wants Final everywhere it can go, not a default.

Python 3.11+, no runtime dependencies.

Use

Tool Setup Reports Suppress
CLI constricter [PATH...] [--level L] [--format F] [-q] LVA001–LVA012 # noqa: LVA001
flake8 install it (on by default) LVA001–LVA012 # noqa: LVA001
pylint load-plugins = ["constricter.plugins.pylint"] C9101–C9112 (symbols below) # noqa: LVA001 or # pylint: disable=<symbol>
ruff run the CLI after ruff; set lint.external = ["LVA"] LVA001–LVA012 # noqa: LVA001

pylint symbols: unannotated-local-variable, untyped-for-or-match-variable, comment-typed-for-variable, unannotated-module-or-class-variable, vague-annotation, deeply-nested-annotation, redundant-annotation, narrowable-annotation, mismatched-value-type, unused-union-member, long-tuple-annotation, could-be-final (off until enabled).

Options:

Option CLI [tool.constricter] flake8 (CLI or config) pylint
level --level level --constricter-level constricter-level
strictest --max: --level=suffocate for every path, --all-scopes, and the opt-in LVA012 — — —
every fix --max-fix: --max, --fix --unsafe-fixes, and --infer-with each of basedpyright, ty and pyrefly that's installed and runs — — —
type comments --type-comments type-comments --constricter-type-comments constricter-type-comments = yes
all scopes --all-scopes all-scopes --constricter-all-scopes constricter-all-scopes = yes
nesting --nesting N nesting --constricter-nesting constricter-nesting
max length --max-length N (LVA011) max-length --constricter-max-length constricter-max-length
vague --vague LEVEL (LVA005, and the fixes offered): -1 none (the default), 0 one Any inside a type that says the rest (tuple[str, Any]), N from 1 N + 1, or one alone vague --constricter-vague constricter-vague
min python --min-python VERSION (the oldest Python the code runs on, whose syntax --fix writes; default: requires-python's) min-python - -
type hierarchy - narrower (a table) --constricter-narrower constricter-narrower
fix --fix (--unsafe-fixes for guesses, --likely for those measured to hold), --diff to preview - - -
infer with --infer-with CHECKERS (basedpyright, ty, pyrefly, several: inferred types, as guesses) infer-with - -
infer from --infer-from FILE (the types python -m constricter.trace -m pytest recorded from a run, as guesses) infer-from - -
show fixes --show-fixes (each fix and how it was decided; with --fix, those made too) - - -
fix levels --fix-select, --fix-ignore, --unsafe-fix-select (mechanisms: docs/FIXES.md) fix-select, fix-ignore, unsafe-fix-select - -
fix plain bases --fix-plain-bases BASES (frameworks' classes whose subclasses' bodies --fix annotates; django's are built in) fix-plain-bases - -
fix widen --fix-widen KINDS (wider types --fix may write, each marked: untyped-parameters, empty-containers, mixed-containers, unions, vague, untyped-calls, unknown-calls; all: every one; docs/FIXES.md) fix-widen - -
select --select CODES (codes or prefixes) select flake8's own select pylint's own enable
extend select --extend-select CODES (also report these; an opt-in code by its full code) extend-select flake8's own extend-select pylint's own enable
ignore --ignore CODES ignore flake8's own extend-ignore pylint's own disable
exclude --exclude GLOB (repeatable) exclude flake8's own exclude pylint's own ignore-paths
format --format: text, full (with source), json, github, sarif, gitlab, junit, rdjson - - -
statistics --statistics (counts per code, text format) - - -
jobs --jobs N (-j; 0: one per CPU) jobs flake8's own --jobs pylint's own --jobs
baseline --baseline FILE; --write-baseline records it baseline - -
coverage --coverage, --fail-under PCT - - -
per-path levels - per-path-levels - -
per-file ignores - per-file-ignores flake8's own per-file-ignores -
stdin - as the path, --stdin-filename PATH - flake8's own - -
exit status --exit-zero - flake8's own --exit-zero pylint's own --exit-zero
output file --output-file FILE - flake8's own --output-file pylint's own --output

constricter --explain LVA002 prints a code's rationale, its fix, and the levels that report it.

The CLI reads [tool.constricter] from the nearest pyproject.toml above the current directory; its flags override it, and --exclude adds to it. An unknown key or a bad value exits 2.

[tool.constricter]
level = "constrict" # or 2
exclude = ["tests/fixtures/*"]
type-comments = false
all-scopes = true
nesting = 3
max-length = 4
vague = -1 # the default: no `Any`; 0 lets `dict[str, Any]` through, 1 `Any` itself
min-python = "3.11" # the default: your `requires-python`'s lower bound
jobs = 0
baseline = "constricter-baseline.json" # the default; relative to this pyproject.toml

# The first glob a file matches sets its level; other files get `level`.
[tool.constricter.per-path-levels]
"tests/*" = "strict"

# Codes (or prefixes) to drop for files matching a glob.
[tool.constricter.per-file-ignores]
"tests/fixtures/*" = ["LVA005", "LVA006"]

# Your own type hierarchy for LVA008–LVA010: each type, and the types it's narrower than.
[tool.constricter.narrower]
UserId = ["str"]  # an imported NewType the rules then compare
int = []          # an `int` no longer fits `float`
select = ["LVA00"]
ignore = ["LVA003"]

--fix adds the annotation where the value decides it: a literal (count = 0 becomes count: int = 0), a container whose elements agree, a constructor or a function that declares its return type or whose returns agree (in another checked file too), a copy, subscript, attribute or method call of a local whose type is known, and values computed from those; a loop's target or an unpacking's names get a declaration on the line before. --unsafe-fixes adds guesses, --likely only those measured to hold as often as a certain fix (docs/LIKELY.md), and --show-fixes lists each fix and how its value decided it, and after --fix each one made. --infer-with basedpyright (or ty, or pyrefly, or several: basedpyright,ty; each installed alongside) asks those type checkers for what --fix can't type itself, as guesses; --infer-from FILE takes the types a run bound each name to, recorded by python -m constricter.trace -m pytest, the same way. The full list is in docs/FIXES.md.

Installing and running

pip install python-constricter           # into the project's environment
uvx --from python-constricter constricter # or run it without installing: uv's tool runner
pipx run --spec python-constricter constricter  # or pipx's

On CPython 3.11 to 3.14 for Linux, macOS and Windows, pip installs a build compiled with mypyc, about a fifth faster; anywhere else, the pure Python one, which finds and fixes the same.

Tools that run flake8 or pylint (VS Code's extensions, python-lsp-server, prospector, MegaLinter, Trunk) pick the plugin up once it's installed alongside them.

Without lint.external, ruff flags # noqa: LVA00x (RUF102) and --fix deletes it.

The CLI defaults to ., checks *.py and *.ipynb, and skips hidden dirs, __pycache__, venv, site-packages, build, dist and node_modules by directory name; --exclude adds more directory names (or globs) to skip the same way, on top of matching whole paths and file names. Under a directory in a git checkout it checks only what git tracks or would, so nothing a .gitignore names (a file named on the command line is checked regardless); --no-gitignore, or gitignore = false, walks the directory whole. Exit codes: 0 no errors, 1 errors, 2 an unreadable or unparsable file, a --fix its encoding can't hold, or a bad pyproject.toml. A module is read in its PEP 263 declaration's encoding.

pre-commit, after ruff's hooks (or constricter-fix, which runs --fix first):

- repo: https://github.com/ivylikethevine/python-constricter
  rev: vX.Y.Z # the latest release; `pre-commit autoupdate` sets it
  hooks:
    - id: constricter

pre-commit.ci, tox, nox, Bazel, Pants and the GitHub Action (PR annotations, a summary table and a SARIF log) are in docs/INTEGRATIONS.md; settings for VS Code, Zed and Neovim are in docs/editors/.

Baselines

To adopt constricter on a codebase that already has offences, record them, then report only new ones:

constricter --write-baseline src # writes constricter-baseline.json next to pyproject.toml
constricter src                  # reports only offences the baseline doesn't cover

A baseline counts each file's offences by code and variable name, not line number, so it survives code moving around; another offence for a name it covers is still reported. Paths in it are relative to it. It's JSON, and like every JSON file constricter reads it may have // and /* */ comments and trailing commas. --baseline FILE or baseline in [tool.constricter] names another file; the default one is used only if it exists.

Annotation coverage

constricter --coverage src prints the share of first bindings that are typed, per file and in total; the bindings are the ones the rules cover (with --all-scopes, module and class bodies too), and # noqa doesn't make one typed. --fail-under PCT (which implies --coverage) exits 1 below PCT, so CI can hold a codebase to a share. With --format=json it prints {"typed", "total", "widened", "percent", "files"}, which a badge can read: publish that JSON somewhere (a gist, a release asset) and point shields.io's dynamic JSON badge at it with the query $.percent. This project keeps its own share at 100% in CI, so its badge is static.

Notebooks

.ipynb files are checked too (directories include them): their code cells are read as one module, IPython-only lines (%magic, !shell, obj?, %%cell magics) are skipped, and each offence is reported at its cell and line (analysis.ipynb:cell 3:2:5). JSON output has a cell field; GitHub and SARIF output point at the file and put the cell in the message. --fix and --diff edit the cells, keeping the notebook's formatting.

Adopting it on an existing codebase

  1. See the scale: constricter --statistics src counts offences per code.
  2. Record them: constricter --write-baseline src, and commit constricter-baseline.json.
  3. Enforce it for new code: add the pre-commit hook or the GitHub Action; the baseline keeps old offences quiet, and --diff / --fix clear the easy ones.
  4. Burn it down: fix a file or package at a time, then --write-baseline again to shrink the file.
  5. Tighten: raise level (or per-path-levels for the parts that are clean), then turn on all-scopes.

Output formats

--format is text (the default), json, github (workflow annotations), sarif (below), gitlab (Code Climate JSON, for GitLab's merge-request Code Quality widget: pass the file as a codequality report artifact), junit (a test suite per file, a failed test case per offence, for Jenkins, Azure Pipelines, CircleCI or GitLab's test reports) or rdjson (for reviewdog, with each certain fix as a suggestion). --output-file FILE writes the report there, and --exit-zero exits 0 even when there are errors (not when a file can't be read).

Editors (standard input)

constricter - --stdin-filename path/to/file.py checks standard input, reported as that path (which also picks its per-path level and baseline entry; a .ipynb name reads a notebook). With --fix it prints the fixed source instead of a report, and --diff diffs it. That's what editors that lint unsaved buffers through a command need (none-ls, nvim-lint, flycheck, ALE, efm-langserver, Helix).

SARIF (code scanning)

--format=sarif writes SARIF 2.1.0, with each result's level (error or warning) set by --level. Each rule has its help text and a link to Rules, and each certain fix is a SARIF fix (columns count characters: columnKind is unicodeCodePoints). In GitHub Actions, upload it to code scanning (the job needs security-events: write; the GitHub Action's sarif-file output does the same):

- run: constricter --format=sarif src > constricter.sarif
- if: ${{ !cancelled() }} # upload the findings even when the step above failed on them
  uses: github/codeql-action/upload-sarif@24c54180a607b1449ed407dd24f251e4e9147c8d # v4.38.3
  with:
    sarif_file: constricter.sarif
    category: constricter

SonarQube and SonarCloud import it with sonar.sarifReportPaths=constricter.sarif; any other tool that reads SARIF 2.1.0 takes the same file.

Development

Setting up, the checks CI runs, the corpus runs and the rules this project's own linters leave off are in docs/CONTRIBUTING.md.

Roadmap

What's done and what's next, by scope: docs/ROADMAP.md.

AI usage

Heavily inspired by Dictionarry/Profilarr's AI Transparency Statement.

I have used generative AI to write large parts of this code. All of the code here is my responsibility regardless: AI is a tool, not an owner of a project. I have personally understood, reviewed, and approved all of the AI-generated code in this repository, and mainline releases carry the same accountability to me as anything I write and publish myself.

Metadata

Release files for python-constricter 0.4.1

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

Source distribution (sdist)

Source distribution for python-constricter 0.4.1
File Size Uploaded
python_constricter-0.4.1.tar.gz 644.8 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for python-constricter 0.4.1
File
python_constricter-0.4.1-py3-none-any.whl Python 3 none any Details
python_constricter-0.4.1-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
python_constricter-0.4.1-cp314-cp314-win32.whl CPython 3.14 CPython 3.14 Windows x86-32 Details
python_constricter-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.17+ x86-64, Linux glibc 2.28+ x86-64 Details
python_constricter-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 Linux glibc 2.17+ ARM64, Linux glibc 2.28+ ARM64 Details
python_constricter-0.4.1-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details
python_constricter-0.4.1-cp314-cp314-macosx_10_15_x86_64.whl CPython 3.14 CPython 3.14 macOS 10.15+ x86-64 Details
python_constricter-0.4.1-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
python_constricter-0.4.1-cp313-cp313-win32.whl CPython 3.13 CPython 3.13 Windows x86-32 Details
python_constricter-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ x86-64, Linux glibc 2.28+ x86-64 Details
python_constricter-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ ARM64, Linux glibc 2.28+ ARM64 Details
python_constricter-0.4.1-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
python_constricter-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl CPython 3.13 CPython 3.13 macOS 10.13+ x86-64 Details
python_constricter-0.4.1-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
python_constricter-0.4.1-cp312-cp312-win32.whl CPython 3.12 CPython 3.12 Windows x86-32 Details
python_constricter-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ x86-64, Linux glibc 2.28+ x86-64 Details
python_constricter-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ ARM64, Linux glibc 2.28+ ARM64 Details
python_constricter-0.4.1-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
python_constricter-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl CPython 3.12 CPython 3.12 macOS 10.13+ x86-64 Details
python_constricter-0.4.1-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
python_constricter-0.4.1-cp311-cp311-win32.whl CPython 3.11 CPython 3.11 Windows x86-32 Details
python_constricter-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ x86-64, Linux glibc 2.28+ x86-64 Details
python_constricter-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ ARM64, Linux glibc 2.28+ ARM64 Details
python_constricter-0.4.1-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
python_constricter-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl CPython 3.11 CPython 3.11 macOS 10.9+ x86-64 Details

Total release size: 88.2 MB

Release files / python_constricter-0.4.1.tar.gz

Download URL python_constricter-0.4.1.tar.gz
Size 644.8 kB
Tags Source
SHA-256 checksum
How to use checksums
8d540cc8479f93b1e7d473ccb77aa1c4917719b6d7871ec2ada01d17d3e5cb9c
BLAKE2b-256 checksum
How to use checksums
68e71ceb81d49f6128764d4041898fc571f097fac7e3e01c6ac7799ae555bec7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-py3-none-any.whl

Download URL python_constricter-0.4.1-py3-none-any.whl
Size 668.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
18ccb608f378d23a3b00d8c52a6248dbd18160c06dc09c0ac09d9ebdfa8de67a
BLAKE2b-256 checksum
How to use checksums
bde4d837b1e1838ef8d7ba6f70a1237f43e2ad4aacd3400007574c469596752a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp314-cp314-win_amd64.whl

Download URL python_constricter-0.4.1-cp314-cp314-win_amd64.whl
Size 3.4 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
530dbde3a8a0636c9360b25fc32a9c64407220951b984dbe0694235305db4fc3
BLAKE2b-256 checksum
How to use checksums
1080da840bc6583214361e282db8dfe36c6c83b87a9ee40bf33cef400fd3aadf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp314-cp314-win32.whl

Download URL python_constricter-0.4.1-cp314-cp314-win32.whl
Size 3.0 MB
Tags CPython 3.14 Windows x86-32
SHA-256 checksum
How to use checksums
f98b0277ae71684c41a46d93d2ca54ab677829f40e03f6c1a1af52737f02a27f
BLAKE2b-256 checksum
How to use checksums
cc31befd250010bca6f30455e75a724854991fb606caed4861c605d2f02ba292
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL python_constricter-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 3.9 MB
Tags CPython 3.14 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
7386e4c64a10312bcd447e52d4a32de69378409a4db7178a951e6ec3865b6431
BLAKE2b-256 checksum
How to use checksums
0a17b4d57c639bf622581b8e622589431b816876bb8a28ed35c2dd466f2182b1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl

Download URL python_constricter-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Size 3.7 MB
Tags CPython 3.14 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
6709837ab7b25900f17f8df1b5d49b03bcbcf5392a614d4f59a027c890d5d60e
BLAKE2b-256 checksum
How to use checksums
5d782dd8b430c2d7f4771fb01719f84e21042558643620cd6a210f170ceca193
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp314-cp314-macosx_11_0_arm64.whl

Download URL python_constricter-0.4.1-cp314-cp314-macosx_11_0_arm64.whl
Size 3.8 MB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
ee43225a2b8a0c31dcc4c5845327b3ddad4d2a88fe6f8aa679b029a83428a28a
BLAKE2b-256 checksum
How to use checksums
e158161b1adc7321525e8b0ca7ca3ea2795ab2164a1168f7ad4aa52e6fdd7168
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp314-cp314-macosx_10_15_x86_64.whl

Download URL python_constricter-0.4.1-cp314-cp314-macosx_10_15_x86_64.whl
Size 4.1 MB
Tags CPython 3.14 macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
66e727295f5b6c4508fe20931ed2ae64fb437898fe8f1676df10757781c74592
BLAKE2b-256 checksum
How to use checksums
97478dcf2f5937a253add429f8e7e929188d43f13444469ca4dba58bdf89a51c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp313-cp313-win_amd64.whl

Download URL python_constricter-0.4.1-cp313-cp313-win_amd64.whl
Size 3.3 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
1e1a406e9f1a532e39bd0f95b0e5dfa81214bc54a2808f395367bd067d1ff671
BLAKE2b-256 checksum
How to use checksums
885009c7c1cc3a892af09753026a426adc313e7e5722d715e944f888dfb49763
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp313-cp313-win32.whl

Download URL python_constricter-0.4.1-cp313-cp313-win32.whl
Size 3.0 MB
Tags CPython 3.13 Windows x86-32
SHA-256 checksum
How to use checksums
ddec587813804d93e371ecd48ee8d6d723dc943f55328c0d9fd9405e711fd546
BLAKE2b-256 checksum
How to use checksums
24862b385fad76add4c9634236cb6d27dddd6191deea677b8b10d7ad70fb2006
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL python_constricter-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 3.9 MB
Tags CPython 3.13 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
76570a3156c8db69647c31a2014817e88d8019ca1f04948d5b54da6a2e2103ac
BLAKE2b-256 checksum
How to use checksums
2884e42f362977950f1d13006dd60e597c4a6ac4c2c42b4bf4e9654882f790e3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl

Download URL python_constricter-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Size 3.7 MB
Tags CPython 3.13 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
199a98339d1c55cf0f9931d02c9adbdfed146c084eac61287b26461bf523f9b6
BLAKE2b-256 checksum
How to use checksums
ee9776aec47c90522b4c7169d0a72321127f9e506e02a0eca19325042f9642d7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp313-cp313-macosx_11_0_arm64.whl

Download URL python_constricter-0.4.1-cp313-cp313-macosx_11_0_arm64.whl
Size 3.8 MB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
20d1c1353e458600bcb71a29e2b6683bb19fa7fda78686dc4c8b280d55b2e8b7
BLAKE2b-256 checksum
How to use checksums
2f037342419784ab85543f383630c6eaf4db6144fc4b17c4ab024183d90a76fe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl

Download URL python_constricter-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl
Size 4.1 MB
Tags CPython 3.13 macOS 10.13+ x86-64
SHA-256 checksum
How to use checksums
7110fed5b54492f6e90fb0c805bc90e7abae3c3323bba90828f948451afc43ff
BLAKE2b-256 checksum
How to use checksums
d9416d2108e08ad17483b313b6be0047c33d64409eb0c868ee5ef184b93be3af
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp312-cp312-win_amd64.whl

Download URL python_constricter-0.4.1-cp312-cp312-win_amd64.whl
Size 3.3 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
97da4018eba5eea16273298200200bd8c5197462eb797303bb56f1c8fdc7b316
BLAKE2b-256 checksum
How to use checksums
e7f07fdeff4644a0cff489e60c870a3a2d70843c7793b618380e231ad3cb4a10
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp312-cp312-win32.whl

Download URL python_constricter-0.4.1-cp312-cp312-win32.whl
Size 2.9 MB
Tags CPython 3.12 Windows x86-32
SHA-256 checksum
How to use checksums
8275f8c1e6a519ce2394a0835a53e7d63c3f6a289fbb187003185ff20f28aa01
BLAKE2b-256 checksum
How to use checksums
cbfd9e1b17af3348db24fd2812401de3810831e7f95617a38da2f998e2a5dd57
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL python_constricter-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 3.9 MB
Tags CPython 3.12 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
94e3efbf781d383aca4c6f92d31967a9f1daf5054e34e64c1fc19022b70e0fa8
BLAKE2b-256 checksum
How to use checksums
b1e469573a7d05d361d90347b8abb799b6a11e3557d2343469dc0ab4536a3ff2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl

Download URL python_constricter-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Size 3.7 MB
Tags CPython 3.12 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
44a182c3aa3a0d06fac42cfc48c2d9112248bfbdc1a0a251310050520a07bb1e
BLAKE2b-256 checksum
How to use checksums
0d8d57348826558d64fceecb734bb345f27846e07334d57a844341881e540084
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp312-cp312-macosx_11_0_arm64.whl

Download URL python_constricter-0.4.1-cp312-cp312-macosx_11_0_arm64.whl
Size 3.8 MB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
e67523b352151b6123061327e2204f78580a21a21de841d910e1381b74264277
BLAKE2b-256 checksum
How to use checksums
b5bdd2a0c07f3c51629c21273bcf91a510cc1ce5bf14bd7d53a769ec0c61708b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl

Download URL python_constricter-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl
Size 4.2 MB
Tags CPython 3.12 macOS 10.13+ x86-64
SHA-256 checksum
How to use checksums
27244c3c86187fd38bd5687c4b2e7eb5318771b65a8204af0d237db733c280b3
BLAKE2b-256 checksum
How to use checksums
0b17931d1526a87dd10a31fa8b9b97ab998222474f10b0f90831dc5c6846971e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp311-cp311-win_amd64.whl

Download URL python_constricter-0.4.1-cp311-cp311-win_amd64.whl
Size 3.3 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
446ea4514cc17698d25ccec8648860f2921b9f0f0d8d138b01ee228915a0cbc4
BLAKE2b-256 checksum
How to use checksums
b93e605f5e6a620dc3cfd0bae7690afcc53967872ee0e4d8b4ee7cf80c5a887e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp311-cp311-win32.whl

Download URL python_constricter-0.4.1-cp311-cp311-win32.whl
Size 2.9 MB
Tags CPython 3.11 Windows x86-32
SHA-256 checksum
How to use checksums
cf2f05bd8fbd2002052035fe931d5f055c8f1b316466e05bf25422e973ad7ad1
BLAKE2b-256 checksum
How to use checksums
ac1afab634f3a84b5ca56942b63f993bb70be4f2e121be7f2fcb925d42af1877
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl

Download URL python_constricter-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Size 3.8 MB
Tags CPython 3.11 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
858a887036c35fd1a921c6a2b9b5d2666d0eec72eecb711ef4bc7ec357715b54
BLAKE2b-256 checksum
How to use checksums
5c9f53240d41ea8185bac8cd38d9a6e0f6f8d17afb0b0477b246df1f0c6689ea
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl

Download URL python_constricter-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Size 3.6 MB
Tags CPython 3.11 Linux glibc 2.17+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
055f976cf3fe935e3a47f42a3fffe80b96e8043227400547d17283a15ae11e87
BLAKE2b-256 checksum
How to use checksums
32ea934d814e48e7e8d873db083af8c89b8390f776a4d8294b5905fea800c675
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp311-cp311-macosx_11_0_arm64.whl

Download URL python_constricter-0.4.1-cp311-cp311-macosx_11_0_arm64.whl
Size 3.8 MB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
dd5a2f338e6275fec9d6a2e20db5eeac76e478af6d2821eb5df844b2ed7b6f3d
BLAKE2b-256 checksum
How to use checksums
6109f7f1274a25fc73530bc287e59b3a38a91f3a93fcbfc82bead41165567e5a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release files / python_constricter-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl

Download URL python_constricter-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl
Size 4.1 MB
Tags CPython 3.11 macOS 10.9+ x86-64
SHA-256 checksum
How to use checksums
c016151291a5ed33b968e4cb2f2b6c0ab1e347542fe6372b5f5b308c1e4eb636
BLAKE2b-256 checksum
How to use checksums
d513ce3024a7e0db1383f1012b139004e827a43c2e4e13cddf57abdd1ac300d0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 19, 2026.

Transparency log

Release history Release notifications | RSS feed

0.4.2

22 release files

This release

0.4.1 This release

26 release files

0.3.6

2 release files

0.3.5

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.2.9

2 release files

0.2.8

2 release files

0.2.7

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

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