
#443 Patching Multiprocessing
Python Bytes
Intro
This chapter introduces an efficient Markdown formatter developed in Rust, designed for Python developers with its PyPI wrapper. It explores features like pre-commit hooks and extensive linting rules while addressing the common challenges in traditional Markdown formatting.
- 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