black v22.1.0 Release Notes

  • At long last, Black is no longer a beta product! This is the first non-beta release ๐Ÿš€ and the first release covered by our new stability policy.


    • โœ‚ Remove Python 2 support (#2740)
    • Introduce the --preview flag (#2752)

    ๐Ÿ’… Style

    • ๐Ÿšš Deprecate --experimental-string-processing and move the functionality under --preview (#2789)
    • For stubs, one blank line between class attributes and methods is now kept if there's at least one pre-existing blank line (#2736)
    • Black now normalizes string prefix order (#2297)
    • โœ‚ Remove spaces around power operators if both operands are simple (#2726)
    • โ†ช Work around bug that causes unstable formatting in some cases in the presence of the magic trailing comma (#2807)
    • ๐Ÿ‘‰ Use parentheses for attribute access on decimal float and int literals (#2799)
    • Don't add whitespace for attribute access on hexadecimal, binary, octal, and complex literals (#2799)
    • Treat blank lines in stubs the same inside top-level if statements (#2820)
    • ๐Ÿ›  Fix unstable formatting with semicolons and arithmetic expressions (#2817)
    • ๐Ÿ›  Fix unstable formatting around magic trailing comma (#2572)

    ๐Ÿ“œ Parser

    • ๐Ÿ›  Fix mapping cases that contain as-expressions, like case {"key": 1 | 2 as password} (#2686)
    • ๐Ÿ›  Fix cases that contain multiple top-level as-expressions, like case 1 as a, 2 as b (#2716)
    • ๐Ÿ›  Fix call patterns that contain as-expressions with keyword arguments, like case Foo(bar=baz as quux) (#2749)
    • Tuple unpacking on return and yield constructs now implies 3.8+ (#2700)
    • Unparenthesized tuples on annotated assignments (e.g values: Tuple[int, ...] = 1, 2, 3) now implies 3.8+ (#2708)
    • ๐Ÿ›  Fix handling of standalone match() or case() when there is a trailing newline or a comment inside of the parentheses. (#2760)
    • from __future__ import annotations statement now implies Python 3.7+ (#2690)

    ๐ŸŽ Performance

    • ๐Ÿ“œ Speed-up the new backtracking parser about 4X in general (enabled when --target-version is set to 3.10 and higher). (#2728)
    • Black is now compiled with mypyc for an overall 2x speed-up. 64-bit Windows, MacOS, and Linux (not including musl) are supported. (#1009, #2431)

    ๐Ÿ”ง Configuration

    • Do not accept bare carriage return line endings in pyproject.toml (#2408)
    • โž• Add configuration option (python-cell-magics) to format cells with custom magics in Jupyter Notebooks (#2744)
    • ๐Ÿ‘ Allow setting custom cache directory on all platforms with environment variable BLACK_CACHE_DIR (#2739).
    • 0๏ธโƒฃ Enable Python 3.10+ by default, without any extra need to specify --target-version=py310. (#2758)
    • ๐Ÿ‘‰ Make passing SRC or --code mandatory and mutually exclusive (#2804)


    • ๐Ÿ‘Œ Improve error message for invalid regular expression (#2678)
    • ๐Ÿ‘Œ Improve error message when parsing fails during AST safety check by embedding the underlying SyntaxError (#2693)
    • No longer color diff headers white as it's unreadable in light themed terminals (#2691)
    • Text coloring added in the final statistics (#2712)
    • Verbose mode also now describes how a project root was discovered and which paths will be formatted. (#2526)


    • ๐Ÿšš All upper version bounds on dependencies have been removed (#2718)
    • typing-extensions is no longer a required dependency in Python 3.10+ (#2772)
    • Set click lower bound to 8.0.0 (#2791)


    • โšก๏ธ Update GitHub action to support containerized runs (#2748)

    ๐Ÿ“š Documentation

    • ๐Ÿ”„ Change protocol in pip installation instructions to https:// (#2761)
    • ๐Ÿ”„ Change HTML theme to Furo primarily for its responsive design and mobile support (#2793)
    • ๐Ÿ—„ Deprecate the black-primer tool (#2809)
    • ๐Ÿ‘ Document Python support policy (#2819)