Skip to main content

docfmt

Reliable docstring formatter for Python

Python versions PyPI Tests Coverage Code style: black

Motivation

Docstring formatters that rebuild the file from a token stream are prone to a particular class of bug: edits computed against one version of the token list get applied to another, so behavior depends on how much unrelated code precedes the docstring being formatted. The symptom is formatting that changes when you add or remove an unrelated class elsewhere in the file.

docfmt is built so that cannot happen:

  • Docstrings are located by AST structure, never by token heuristics or by matching line contents.
  • The file is never regenerated. Formatting produces a set of non-overlapping character-range replacements against the original source; everything outside a docstring is preserved byte-for-byte.
  • Results are verified before they are written. Every formatted file is checked for AST equivalence (nothing changed but docstring contents) and for idempotency (format(format(x)) == format(x)). A failure leaves the file untouched and reports an internal error rather than writing a bad result.

Behavior

docfmt normalizes docstring layout and never mutates author text. Adding a trailing period is the one exception, and it is opt-in (--add-summary-period).

Blank lines around docstrings are preserved by default. Normalization is opt-in per position under [tool.docfmt.blank-lines].

Structured content is copied verbatim and never rewrapped: fenced code blocks, MyST directives, doctests, reST directives and field lists, tables, and lists.

MyST directives

MyST directives nest by widening the fence, so fence length is significant:

```{note}
Test note
```

A block closes only on a fence of the same character with at least as many markers and no info string, so a narrower inner fence is content:

````{note}
```{warning}
Test warning
```
````

Inline constructs such as `False`{l=python} are treated as unbreakable atoms, so wrapping never splits an inline code span from its role attribute.

Attribute docstrings

A string statement immediately following an assignment at module or class level is an attribute docstring, including annotation-only attributes:

package: str
"""
Import name of the package.
"""

Usage

docfmt --in-place --recursive src test
docfmt --check src        # exit 1 if anything would change
docfmt --diff src

Configure via [tool.docfmt] in pyproject.toml:

[tool.docfmt]
in-place = true
recursive = true
summary-on-own-line = true
Key Default Meaning
line-length black's, else 88 wrap width; 0 disables wrapping
summary-on-own-line false put the summary below the opening quotes
blank-after-description false blank line before the closing quotes
force-reflow false refill prose that already fits
add-summary-period false append a period to summaries
exclude [] path fragments to skip when recursing
in-place false write changes instead of printing a diff
check false only report files which would change
diff false print a unified diff even in in-place or check mode
recursive false recurse into directories given as arguments

An unrecognized key in [tool.docfmt] or [tool.docfmt.blank-lines] is an error (exit code 2), so a typo cannot silently do nothing.

Command-line flags win over the config file. --in-place and --check select their mode outright, so either overrides a mode set in the config file; setting both in the config file is an error.

line-length is left unset by default and picked up from [tool.black] line-length when black is configured, falling back to 88.

Blank-line rules live in their own table. Each is a count, or "preserve" to leave the author's spacing alone:

[tool.docfmt.blank-lines]
before-class = "preserve"
after-module = 1
after-class = 1
after-function = "preserve"
after-attribute = 1

Exit codes

Code Meaning
0 Nothing to do, or changes written in in-place mode
1 Check mode: files would change
2 Error; no file was modified

Metadata

Release files for docfmt 0.3.0

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

Source distribution (sdist)

Source distribution for docfmt 0.3.0
File Size Uploaded
docfmt-0.3.0.tar.gz 16.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for docfmt 0.3.0
File Interpreter ABI Platform
docfmt-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 37.8 kB

Release files / docfmt-0.3.0.tar.gz

Download URL docfmt-0.3.0.tar.gz
Size 16.6 kB
Tags Source
SHA-256 checksum
How to use checksums
47319bbff54dd4fcbf5a365eadecdc50053c8f1c90c32e4bd0d2f65a5c145cc6
BLAKE2b-256 checksum
How to use checksums
9e506c4a492d207d6197dcdc8fe6c0e163db1d692431f148fae6b38ff7056694
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.25 {"installer":{"name":"uv","version":"0.11.25","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / docfmt-0.3.0-py3-none-any.whl

Download URL docfmt-0.3.0-py3-none-any.whl
Size 21.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
873306120d5869d9f1cd85c2e426b8ff9cd9c3987e00a4698391744dd928c44a
BLAKE2b-256 checksum
How to use checksums
740c6e6a514bafbf2ddff54d02b4b9534f3ea2e700926b7495a977d55eb6aae3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.25 {"installer":{"name":"uv","version":"0.11.25","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 release files

0.2.0

2 release files

0.1.0

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