blank-line-after-blocks
A Python formatter to automatically add blank lines after if/for/while/with/try blocks to improve code readability.
Installation
pip install blank-line-after-blocks
Usage
Command Line
# Format Python files
blank-line-after-blocks file1.py file2.py
# Format with exclude patterns (regex - use | for multiple patterns)
blank-line-after-blocks --exclude "tests/|_generated\.py$" src/
# Format Jupyter notebooks
blank-line-after-blocks-jupyter notebook1.ipynb notebook2.ipynb
# Format notebooks with exclude patterns (regex)
blank-line-after-blocks-jupyter --exclude "notebooks/generated/" notebooks/
Pre-commit Hook
Add this to your .pre-commit-config.yaml:
repos:
- repo: https://github.com/jsh9/blank-line-after-blocks
rev: <LATEST_TAG>
hooks:
- id: blank-line-after-blocks
- id: blank-line-after-blocks-jupyter
Pre-commit with exclude patterns
repos:
- repo: https://github.com/jsh9/blank-line-after-blocks
rev: <LATEST_TAG>
hooks:
- id: blank-line-after-blocks
args: ["--exclude", "tests/|_generated\.py$"]
- id: blank-line-after-blocks-jupyter
args: ["--exclude", "notebooks/generated/"]
Configuration File
You can also configure exclude patterns in pyproject.toml:
[tool.blank-line-after-blocks]
exclude = [
"tests/", # Exclude all files in tests directory
"_generated\.py$", # Exclude files ending with _generated.py
"vendor/", # Exclude all files in vendor directory
"build/", # Exclude build directory
]
Note: CLI --exclude options take precedence over configuration file
settings.
What it does
This tool automatically adds one blank line after the end of:
ifstatementsforloopswhileloopswithstatementstry/except/finallyblocks
This improves code readability by providing visual separation between blocks and subsequent code.
Examples
Basic if and for blocks
if condition:
do_something()
+
next_statement()
for item in items:
process(item)
+
final_step()
if a > 3:
print('a > 3')
# Already a comment; no new line added
a += 2
Try/except blocks with context managers
def process_files(filenames):
results = []
for filename in filenames:
try:
with open(filename) as f:
data = json.load(f)
+
results.append(data)
except FileNotFoundError:
print(f'File {filename} not found')
except json.JSONDecodeError:
print(f'Invalid JSON in {filename}')
+
return results
Nested blocks in class methods
class TestClass:
def method(self):
try:
if self.condition():
with self.get_context():
self.do_work()
+
self.cleanup()
+
except Exception as e:
self.handle_error(e)
+
print('method complete')
Compound blocks stay tight (no blank line before else/elif/except/finally)
If a block ends right before the second part of compound blocks (if/else, try/except, etc.), no blank line is added:
for item in items:
if found(item):
break
else:
not_found()
Metadata
Release files for blank-line-after-blocks 0.1.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| blank_line_after_blocks-0.1.4.tar.gz | 32.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| blank_line_after_blocks-0.1.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 41.5 kB
Release files / blank_line_after_blocks-0.1.4.tar.gz
| Download URL | blank_line_after_blocks-0.1.4.tar.gz |
|---|---|
| Size | 32.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3b7b9ef3a3c298c52d718c87f99eada30a75d1792150d8bacf924436c5ffe884
|
|
BLAKE2b-256 checksum How to use checksums |
1c11188cc43fff820b6292db86bbd796fd9079dd4caca6af86ac11f508858985
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blank_line_after_blocks-0.1.4-py3-none-any.whl
| Download URL | blank_line_after_blocks-0.1.4-py3-none-any.whl |
|---|---|
| Size | 9.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a920744aefb0969155074a5bff6db183fa76271f385a2245ed21ab362761f615
|
|
BLAKE2b-256 checksum How to use checksums |
79deb25edbae61a06e28440f39194541430dcd5d7ab194e13844f305a2425284
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|