
#443 Patching Multiprocessing
Python Bytes
Exciting Updates in Coverage Tool: version 7.10 and Markdown Best Practices
This chapter highlights the significant updates in the coverage tool's latest release, version 7.10, focusing on improvements like patch support for subprocesses and better process handling. It also covers best practices for using markdown in documentation, addressing common pitfalls and preferences for long-form writing.
- rumdl - A Markdown Linter written in Rust
- * Coverage 7.10.0: patch*
- * aioboto3*
- * You might not need a Python class*
- Extras
- Joke
About the show
Connect with the hosts
- Michael: @mkennedy@fosstodon.org / @mkennedy.codes (bsky)
- Brian: @brianokken@fosstodon.org / @brianokken.bsky.social
- Show: @pythonbytes@fosstodon.org / @pythonbytes.fm (bsky)
Join us on YouTube at pythonbytes.fm/live to be part of the audience. Usually Monday at 10am PT. Older video versions available there too.
Finally, if you want an artisanal, hand-crafted digest of every week of the show notes in email form? Add your name and email to our friends of the show list, we'll never share it.
Michael #1: rumdl - A Markdown Linter written in Rust
- via Owen Lamont
- Supports toml file config settings
- Install via uv tool install rumdl.
- ⚡️ Built for speed with Rust - significantly faster than alternatives
- 🔍 54 lint rules covering common Markdown issues
- 🛠️ Automatic fixing with
-fix
for most rules - 📦 Zero dependencies - single binary with no runtime requirements
- 🔧 Highly configurable with TOML-based config files
- 🌐 Multiple installation options - Rust, Python, standalone binaries
- 🐍 Installable via pip for Python users
- 📏 Modern CLI with detailed error reporting
- 🔄 CI/CD friendly with non-zero exit code on errors
Brian #2: Coverage 7.10.0: patch
Ned Batchelder
Actually up to 7.10.2 as of today
patch allows coverage to run better when a covered project uses
- subprocesses
- os._exit()
- execv family of functions
Looking at subprocess
- “Coverage works great when you start your program with coverage measurement, but has long had the problem of how to also measure the coverage of sub-processes that your program created. The existing solution had been a complicated two-step process of creating obscure .pth files and setting environment variables. Whole projects appeared on PyPI to handle this for you.”
From release notes
for 7.10.0
A new configuration option: “[run] patch” specifies named patches to work around some limitations in coverage measurement. These patches are available:
patch = _exit
lets coverage save its data even when <code>os._exit()</code> is used to abruptly end the process. This closes long-standing issue 310 as well as its duplicates: issue 312, issue 1673, issue 1845, and issue 1941.patch = subprocess
measures coverage in Python subprocesses created with <code>subprocess</code>, <code>os.system()</code>, or one of the <code>execv</code> or <code>spawnv</code> family of functions. Closes old issue 367 and duplicate issue 378.patch = execv
adjusts the <code>execv</code> family of functions to save coverage data before ending the current program and starting the next. Not available on Windows. Closes issue 43 after 15 years!
Michael #3: aioboto3
- via Pat Decker
- Wrapper to use boto3 resources with the aiobotocore async backend
- aiobotocore allows you to use near enough all of the boto3 client commands in an async manner just by prefixing the command with
await
. - With aioboto3 you can now use the higher level APIs provided by boto3 in an asynchronous manner.
Brian #4: You might not need a Python class
- Adam Grant
- This is an important periodic reminder to everyone coming into Python from other languages.
- Many other languages lean on classes a lot more than we need to in Python
- Adams suggestions
- Simple Data Containers: Use Named Tuples or Data Classes
- Stateless Utility Functions: Just Use Functions
- Grouping Constants: Use Modules
- Managing State with Simple Structures: Use Dictionaries or Lists
- Simple One-off Operations: Use Lambdas or Comprehensions
- I’ll add “just use functions”
- Avoiding Complexity: Built-in Libraries
- When You Actually Need a Class
- I’ll add
- You probably don’t
- If you think you do, ask a friend. Friends don’t let friends create extraneous classes in Python.
- If you think your case is an exception, it probably isn’t
- If you think dataclasses aren’t right for you, check out attrs
- I’ll add
Extras
Brian:
- PyPI Incident Report: Phishing Attack -Sent in by listener John Hagen
- Both of Adam Johnson’s recent-ish interviews are now up on Test & Code
Michael:
- Dive into uv webcast with me and Will Vincent
Joke: Default text editor