Skip to main content

Enforce using keyword arguments where possible.

Project description

strict-kwargs

Fast enforcement of keyword arguments at call sites, without mypy or ty plugins. Detects positional arguments and rewrites them to keyword arguments automatically.

def add(a: int, b: int) -> int: ...

add(a=1, b=2)  # OK
add(1, 2)      # error: too many positional args  ->  fix rewrites to add(a=1, b=2)

Install

uv tool install strict-kwargs   # or: pip install strict-kwargs

Usage

strict-kwargs .                 # check a directory (exit 0 = clean, 1 = violations, 2 = error)
strict-kwargs fix .             # rewrite positional args to keyword args in place
strict-kwargs fix --diff .      # preview the rewrite, write nothing
strict-kwargs --python .venv .  # point the ty fallback at an environment

fix is conservative: it never rewrites a call it would not report, and leaves overloaded callees, *args/**kwargs unpacking, and ty-only-resolved calls untouched (reporting how many it declined). --python accepts an interpreter, venv, or sys.prefix (mirrors ty check --python) for third-party packages outside an activated venv or <project>/.venv. A path that does not exist is a hard error (exit 2), like ruff, rather than a silent "clean" result; a nonexistent --python is reported on stderr and the run falls back to ty's own environment discovery.

pre-commit

repos:
  - repo: https://github.com/adamtheturtle/strict-kwargs-pre-commit
    rev: 2026.5.16.post1  # pin to a release tag
    hooks:
      - id: strict-kwargs

Use the mirror (prebuilt wheel, no Rust toolchain). Pointing repo: at this repository works too but builds from source.

Configuration

In pyproject.toml:

[tool.strict_kwargs]
ignore_names = ["main.func", "builtins.str"]  # fully-qualified names to ignore
debug = false                                  # log debug info and AST dumps to stderr

A missing pyproject.toml, or one without a [tool.strict_kwargs] table, is fine and uses the defaults. A pyproject.toml that exists but cannot be parsed, or whose [tool.strict_kwargs] has the wrong shape or value types (e.g. ignore_names not a list), is a hard error (exit 2) rather than a silent fall back to defaults.

Comparison with mypy-strict-kwargs

mypy-strict-kwargs is a mypy plugin that enforces the same rule. Use strict-kwargs if you type-check with ty or prefer a standalone linter without plugins.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

strict_kwargs-2026.5.18.post2-py3-none-win_amd64.whl (2.1 MB view details)

Uploaded Python 3Windows x86-64

strict_kwargs-2026.5.18.post2-py3-none-manylinux_2_39_x86_64.whl (2.3 MB view details)

Uploaded Python 3manylinux: glibc 2.39+ x86-64

strict_kwargs-2026.5.18.post2-py3-none-macosx_11_0_arm64.whl (2.2 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

File details

Details for the file strict_kwargs-2026.5.18.post2-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for strict_kwargs-2026.5.18.post2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 71035d53159081f8f3fac20514dfcc211a0ac722cb1d3470917f09730a9b9185
MD5 eb9609105e7fa878c36f35ef5fb6f91e
BLAKE2b-256 40c4ea7112cd9b18a77738545ac0df95c68583e4593a3ea699f964c15a08f99f

See more details on using hashes here.

Provenance

The following attestation bundles were made for strict_kwargs-2026.5.18.post2-py3-none-win_amd64.whl:

Publisher: release.yml on adamtheturtle/strict-kwargs

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

File details

Details for the file strict_kwargs-2026.5.18.post2-py3-none-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for strict_kwargs-2026.5.18.post2-py3-none-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 b5c6eceb563e36116a489a74e205f37a35a775fa97712e247235ecb74d4e986b
MD5 bdc57b0c97e4acd56a489d388daed910
BLAKE2b-256 dcf14d69307aac01466a9f971d1e0b5a823f8a4b26eb06ee1a411346d14ffd9b

See more details on using hashes here.

Provenance

The following attestation bundles were made for strict_kwargs-2026.5.18.post2-py3-none-manylinux_2_39_x86_64.whl:

Publisher: release.yml on adamtheturtle/strict-kwargs

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

File details

Details for the file strict_kwargs-2026.5.18.post2-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for strict_kwargs-2026.5.18.post2-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 72234f018a6b3442b4bc3387fb7568c21870684b4dc1247bf75d1366f5cd78a0
MD5 f1857b4ba26b011ec0222e5c9aca369d
BLAKE2b-256 8db2a65b0d80268b9d36cb1c7fd6b2d103b89ea13f34c74a4a94813a9e97a1b9

See more details on using hashes here.

Provenance

The following attestation bundles were made for strict_kwargs-2026.5.18.post2-py3-none-macosx_11_0_arm64.whl:

Publisher: release.yml on adamtheturtle/strict-kwargs

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

Supported by

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