pydoclint 0.10.1


pip install pydoclint

  Latest version

Released: Sep 28, 2026

Project Links

Meta
Author: jsh9
Requires Python: >=3.10

Classifiers

License
  • OSI Approved :: MIT License

Programming Language
  • Python :: 3 :: Only
  • Python :: 3

pydoclint

Downloads Downloads Downloads

pydoclint is the go-to linter for making sure Python docstrings match the code they describe, with monthly downloads.

It checks arguments, return values, yields, raises, class attributes, and type hints in numpy, Google, and Sphinx styles, with a few minor deviations.

Full documentation: jsh9.github.io/pydoclint.


Table of Contents


1. Why pydoclint?

1.1. Docstrings that stay true to the code

A docstring that disagrees with its code is worse than none.

pydoclint catches the drift from everyday edits (a renamed argument, a new raise, a changed return type, an undocumented class attribute) and reports each one as a precise violation.

1.2. Built for the age of AI-assisted coding

AI coding agents write "mostly correct" docstrings, but omissions and hallucinations inevitably happen. That's why a deterministic docstring linter matters more than ever:

  • Docstrings are context for AI. A stale docstring misleads the next agent that reads it.
  • Reduce AI token usage. Agents don't need to spend tokens checking docstrings by hand; pydoclint does it deterministically.
  • Fast enough for every change. It takes only 3 seconds, even on huge codebases like numpy (200k+ lines of code, 1,600+ classes, ~12k functions/methods).
  • Agents can fix what it reports. Violation messages are specific and actionable, so an agent can correct them without a human in the loop.

1.3. Highly configurable

pydoclint offers 30+ configuration options for you to fine-tune it to fit your team's conventions. It also offers a "baseline" mode to ease adoption in legacy codebases.

1.4. pydoclint vs Ruff's DOC rules

Ruff re-implements a small subset of pydoclint's rules. As of September 2026, Ruff still lacks many of pydoclint's features:

pydoclint Ruff (DOC rules)
Number of rules 39 7
Number of config options 30+ 2
Checks type hints ✅ ❌
Checks class attributes ✅ ❌
Sphinx style support ✅ ❌
"Baseline" mode ✅ ❌
Docstring style mismatch check ✅ ❌

Therefore, we recommend using pydoclint to check docstrings and letting Ruff handle other lint rules.

1.5. How to adopt pydoclint?

If you write code manually, this documentation is a good place to start. If you use AI assistants to code, simply say:

Help me adopt pydoclint in my codebase. Read its documentation at https://jsh9.github.io/pydoclint

Additionally, it is highly recommended that you also adopt format-docstring as a pre-commit hook alongside pydoclint. format-docstring syncs argument types, default values, return types, and class attribute types from your code into your docstrings, which automatically fixes many (but not all) of the issues that pydoclint would catch. Run format-docstring first (i.e., list it above pydoclint in .pre-commit-config.yaml), so that pydoclint only reports what's left to fix. format-docstring also standardizes docstring formatting to reduce diffs.

Note: format-docstring writes default values into docstrings by default (e.g., n : int, default=3), while pydoclint by default expects docstrings without them. To make the two tools agree, set pydoclint's --check-arg-defaults=True (or run format-docstring with --include-arg-defaults=False).

Adopting pydoclint in an existing codebase? Use the "baseline" mode: run pydoclint once with --baseline=<FILE> and --generate-baseline=True to record all current violations, and from then on it only reports new ones. With --auto-regenerate-baseline (on by default), the baseline file shrinks as you fix old violations. See the documentation on these options for details.

pydocstyle (or the D rules in Ruff) is recommended too, as it checks some style rules that pydoclint isn't designed to cover.

2. Installation

To install only the native pydoclint tooling, run this command:

pip install pydoclint

To use pydoclint as a flake8 plugin, please run this command, which will also install flake8 to the current Python environment:

pip install pydoclint[flake8]

pydoclint requires Python 3.10 or newer.

3. Usage

3.1. As a native command line tool

pydoclint <FILE_OR_FOLDER>

Replace <FILE_OR_FOLDER> with the file/folder names you want, such as ..

3.2. As a flake8 plugin

Once you install pydoclint[flake8], you can run:

flake8 --select=DOC <FILE_OR_FOLDER>

If you don't include --select=DOC in your command, flake8 will also run other built-in flake8 linters on your code.

3.3. Native vs flake8

Should you use pydoclint as a native command line tool or a flake8 plugin? Here's a comparison:

Pros Cons
Native tool Slightly faster; supports "baseline"; supports inline # noqa No project-wide ignore list for violation codes (inline # noqa only)
flake8 plugin Supports inline or project-wide omission Slightly slower because other flake8 plugins are run together

Tip: In native mode you can suppress DOC violations inline with # noqa: DOCxxx. Use the --native-mode-noqa-location option (valid values: "docstring" or "definition") to decide whether the comment lives on the definition line or at the end of the docstring (after the triple quotes).

3.4. As a pre-commit hook

pydoclint can be used as a pre-commit hook, either in native mode or as a flake8 plugin.

To use it, put the following in your .pre-commit-config.yaml file:

3.4.1. Native mode

- repo: https://github.com/jsh9/pydoclint
  rev: <latest_tag>
  hooks:
    - id: pydoclint
      args: [--style=google, --check-return-types=False]

(Replace <latest_tag> with the latest release tag in https://github.com/jsh9/pydoclint/releases)

3.4.2. As a flake8 plugin

- repo: https://github.com/jsh9/pydoclint
  rev: <latest_tag>
  hooks:
    - id: pydoclint-flake8
      args: [--style=google, --check-return-types=False]

3.5. How to configure pydoclint

Please read How to configure pydoclint for how to set options (on the command line, in pyproject.toml, or in .pre-commit-config.yaml), and Configuration options for the full list.

3.6. How to ignore certain violations

Please read this page: How to ignore certain violations

3.7. Additional tips, tricks, and pitfalls

3.7.1. How to not document certain functions?

If you don't write any docstring for a function, pydoclint will not check it.

Also, if you write a docstring with only a description (without the argument section, the return section, etc.), pydoclint will not check this docstring, because the --skip-checking-short-docstrings is True by default. (You can set it to False.)

3.7.2. Pitfall: type hints and default values

pydoclint compares type hints in docstrings with those in the function signature verbatim. For example, if the signature says int | None, the docstring should also say int | None (not Optional[int] or int, optional).

Default values follow the --check-arg-defaults option:

  • By default (False), leave default values out of docstrings: write n : int, not n : int, default=3.
  • If set to True, default values are required, in the default=... form (e.g., n : int, default=3), and are checked against the signature. (This only applies to numpy and Google styles.)

These are deliberate deviations from the official docstring style guides, for unambiguity and speed. See minor style deviations for the details, and notes on writing type hints for the rationale.

4. Style violation codes

pydoclint currently has 7 categories of style violation codes:

  • DOC0xx: Docstring parsing issues
  • DOC1xx: Violations about input arguments
  • DOC2xx: Violations about return argument(s)
  • DOC3xx: Violations about class docstring and class constructor
  • DOC4xx: Violations about "yield" statements
  • DOC5xx: Violations about "raise" and "assert" statements
  • DOC6xx: Violations about class attributes

For detailed explanations of each violation code, please read this page: pydoclint style violation codes.

5. Documentation map

Every page of the full documentation:

Configuration

Reference

Guides

FAQ and limitations

  • Notes for users: cases pydoclint is not designed to handle, notes on type hints, and editor integration

Contributing

  • Notes for developers: if you'd like to contribute to pydoclint, thank you! This guide helps you get familiar with the code base.
0.10.1 Sep 28, 2026
0.10.0 Sep 27, 2026
0.9.1 Jul 03, 2026
0.9.0 Jun 29, 2026
0.8.7 Jun 22, 2026
0.8.6 Jun 03, 2026
0.8.5 Jun 02, 2026
0.8.4 May 16, 2026
0.8.3 Nov 26, 2025
0.8.2 Nov 21, 2025
0.8.1 Nov 03, 2025
0.8.0 Nov 03, 2025
0.7.6 Oct 26, 2025
0.7.5 Oct 25, 2025
0.7.4 Oct 24, 2025
0.7.3 Sep 03, 2025
0.7.2 Sep 02, 2025
0.7.1 Sep 02, 2025
0.7.0 Sep 02, 2025
0.6.11 Sep 01, 2025
0.6.10 Aug 15, 2025
0.6.9 Aug 14, 2025
0.6.8 Aug 14, 2025
0.6.6 Apr 16, 2025
0.6.5 Apr 03, 2025
0.6.4 Mar 31, 2025
0.6.3 Mar 30, 2025
0.6.2 Feb 17, 2025
0.6.1 Feb 16, 2025
0.6.0 Jan 13, 2025
0.5.19 Jan 13, 2025
0.5.18 Jan 12, 2025
0.5.17 Jan 12, 2025
0.5.16 Jan 11, 2025
0.5.15 Jan 10, 2025
0.5.14 Dec 26, 2024
0.5.13 Dec 20, 2024
0.5.12 Dec 16, 2024
0.5.11 Dec 14, 2024
0.5.10 Dec 07, 2024
0.5.9 Sep 29, 2024
0.5.8 Sep 23, 2024
0.5.7 Sep 03, 2024
0.5.6 Jul 17, 2024
0.5.5 Jul 16, 2024
0.5.4 Jul 14, 2024
0.5.3 Jun 27, 2024
0.5.2 Jun 27, 2024
0.5.1 Jun 24, 2024
0.5.0 Jun 23, 2024
0.4.2 Jun 25, 2024
0.4.1 Feb 17, 2024
0.4.0 Feb 08, 2024
0.3.10 Feb 07, 2024
0.3.9 Jan 16, 2024
0.3.8 Oct 20, 2023
0.3.7 Oct 20, 2023
0.3.6 Oct 18, 2023
0.3.5 Oct 18, 2023
0.3.4 Oct 12, 2023
0.3.3 Oct 02, 2023
0.3.2 Sep 05, 2023
0.3.1 Aug 29, 2023
0.3.0 Aug 28, 2023
0.2.4 Aug 24, 2023
0.2.3 Aug 24, 2023
0.2.2 Aug 22, 2023
0.2.1 Aug 21, 2023
0.2.0 Aug 19, 2023
0.1.9 Aug 18, 2023
0.1.8 Aug 16, 2023
0.1.7 Aug 15, 2023
0.1.6 Aug 15, 2023
0.1.5 Aug 12, 2023
0.1.4 Jul 23, 2023
0.1.3 Jul 21, 2023
0.1.2 Jul 21, 2023
0.1.1 Jul 19, 2023
0.1.0 Jul 16, 2023
0.0.16 Jul 15, 2023
0.0.15 Jul 10, 2023
0.0.14 Jul 05, 2023
0.0.13 Jun 27, 2023
0.0.12 Jun 27, 2023
0.0.11 Jun 26, 2023
0.0.10 Jun 12, 2023
0.0.9 Jun 12, 2023
0.0.8 Jun 06, 2023
0.0.7 Jun 01, 2023
0.0.6 Jun 01, 2023
0.0.5 May 31, 2023
0.0.4 May 27, 2023
0.0.3 May 19, 2023
0.0.2 May 16, 2023
0.0.1 May 15, 2023

Wheel compatibility matrix

Platform Python 3
any

Files in release

Extras:
Dependencies:
click (>=8.1.0)
docstring_parser_fork (==0.0.16)
tomli (>=2.0.1)