
So these won't go out of date. This does mean the environment has be setup a bit more carefully so the right version of the tool is used, but thankfully the build environment is rebuilt on change on RTD anyway. Also since the HTML docs are known to build fine, let's provide downloadable HTMLzips of our docs. This change needs RTD and GH to install Black with the [d] extra so blackd's help can generated. While editing RTD's config file, let's migrate the file to a non-deprecated filename. Also I missed adding AUTHORS.md to the files key in the doc GHA config.
5.3 KiB
The basics
Foundational knowledge on using and configuring Black.
Black is a well-behaved Unix-style command-line tool:
- it does nothing if no sources are passed to it;
- it will read from standard input and write to standard output if
-
is used as the filename; - it only outputs messages to users on standard error;
- exits with code 0 unless an internal error occurred (or
--check
was used).
Usage
To get started right away with sensible defaults:
black {source_file_or_directory}
You can run Black as a package if running it as a script doesn't work:
python -m black {source_file_or_directory}
Command line options
Black has quite a few knobs these days, although Black is opinionated so style
configuration options are deliberately limited and rarely added. You can list them by
running black --help
.
Help output
Configuration via a file
Black is able to read project-specific default values for its command line options
from a pyproject.toml
file. This is especially useful for specifying custom
--include
and --exclude
/--force-exclude
/--extend-exclude
patterns for your
project.
Pro-tip: If you're asking yourself "Do I need to configure anything?" the answer is "No". Black is all about sensible defaults. Applying those defaults will have your code in compliance with many other Black formatted projects.
What on Earth is a pyproject.toml
file?
PEP 518 defines pyproject.toml
as a
configuration file to store build system requirements for Python projects. With the help
of tools like Poetry or
Flit it can fully replace the need for
setup.py
and setup.cfg
files.
Where Black looks for the file
By default Black looks for pyproject.toml
starting from the common base directory of
all files and directories passed on the command line. If it's not there, it looks in
parent directories. It stops looking when it finds the file, or a .git
directory, or a
.hg
directory, or the root of the file system, whichever comes first.
If you're formatting standard input, Black will look for configuration starting from the current working directory.
You can use a "global" configuration, stored in a specific location in your home directory. This will be used as a fallback configuration, that is, it will be used if and only if Black doesn't find any configuration as mentioned above. Depending on your operating system, this configuration file should be stored as:
- Windows:
~\.black
- Unix-like (Linux, MacOS, etc.):
$XDG_CONFIG_HOME/black
(~/.config/black
if theXDG_CONFIG_HOME
environment variable is not set)
Note that these are paths to the TOML file itself (meaning that they shouldn't be named
as pyproject.toml
), not directories where you store the configuration. Here, ~
refers to the path to your home directory. On Windows, this will be something like
C:\\Users\UserName
.
You can also explicitly specify the path to a particular file that you want with
--config
. In this situation Black will not look for any other file.
If you're running with --verbose
, you will see a blue message if a file was found and
used.
Please note blackd
will not use pyproject.toml
configuration.
Configuration format
As the file extension suggests, pyproject.toml
is a
TOML file. It contains separate sections for
different tools. Black is using the [tool.black]
section. The option keys are the
same as long names of options on the command line.
Note that you have to use single-quoted strings in TOML for regular expressions. It's
the equivalent of r-strings in Python. Multiline strings are treated as verbose regular
expressions by Black. Use [ ]
to denote a significant space character.
Example pyproject.toml
[tool.black]
line-length = 88
target-version = ['py37']
include = '\.pyi?$'
extend-exclude = '''
# A regex preceded with ^/ will apply only to files and directories
# in the root of the project.
^/foo.py # exclude a file named foo.py in the root of the project (in addition to the defaults)
'''
Lookup hierarchy
Command-line options have defaults that you can see in --help
. A pyproject.toml
can
override those defaults. Finally, options provided by the user on the command line
override both.
Black will only ever use one pyproject.toml
file during an entire run. It doesn't
look for multiple files, and doesn't compose configuration from different levels of the
file hierarchy.
Next steps
You've probably noted that not all of the options you can pass to Black have been covered. Don't worry, the rest will be covered in a later section.
A good next step would be configuring auto-discovery so black .
is all you need
instead of laborously listing every file or directory. You can get started by heading
over to File collection and discovery.
Another good choice would be setting up an integration with your editor of choice or with pre-commit for source version control.