Skip to content

Instantly share code, notes, and snippets.

@razhangwei
Created August 28, 2025 15:07
Show Gist options
  • Save razhangwei/26f4f20ae8c6a3195b2448f1b53a572b to your computer and use it in GitHub Desktop.
Save razhangwei/26f4f20ae8c6a3195b2448f1b53a572b to your computer and use it in GitHub Desktop.
How to read pyproject.toml

Great question 👍. A pyproject.toml file looks intimidating at first, but it’s just a TOML-formatted config. The trick is to know the sections that matter.

How to Read a pyproject.toml

  1. Build system

[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta"

•	requires → which packages are needed to build (not run) the project.
•	build-backend → tells Python which tool builds the wheel (setuptools, poetry.core, hatchling, etc.).

👉 This tells you what ecosystem you’re in (setuptools vs Poetry vs Hatch).

  1. Project metadata

[project] name = "mypackage" version = "0.1.0" description = "Example project" authors = [{name="Alice", email="[email protected]"}] dependencies = ["requests>=2.0", "numpy"]

•	name / version → how PyPI will see the package.
•	description → human-readable summary.
•	authors → credits.
•	dependencies → runtime dependencies installed with pip install mypackage.

👉 Read this section to know what the package is and what it needs.

  1. Optional / extra dependencies

[project.optional-dependencies] dev = ["pytest", "black"] docs = ["sphinx"]

•	These are extras, installed with pip install mypackage[dev].

👉 Lets you see what’s needed for dev vs docs vs testing.

  1. Tool-specific sections

[tool.black] line-length = 88

[tool.pytest.ini_options] testpaths = ["tests"]

•	Each tool (Black, Ruff, Mypy, Pytest) puts its config under tool.<name>.

👉 This replaces having separate files like .flake8 or pytest.ini.

  1. Other sections you might see • [tool.poetry] → if Poetry is managing the whole project. • [tool.hatch] → if Hatch is used. • [tool.setuptools] → setuptools extra configs. • [tool.coverage] → test coverage rules.

How to actually read it

When you open a pyproject.toml, skim in this order: 1. [build-system] → which ecosystem? (Poetry, setuptools, Hatch). 2. [project] → package metadata and core dependencies. 3. [project.optional-dependencies] → extras for dev/docs/tests. 4. [tool.*] → configs for code quality and testing tools.

That’s 90% of what matters.

✅ Pro tip: It’s like package.json in Node.js. Once you know which backend you’re in, the rest falls into place.

Would you like me to take the pyproject.toml from your screenshot/repo and walk you through it line by line? That way you’ll see these concepts directly in action.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment