Python: use re.prefixmatch() instead of re.match() from Python 3.15
Take this validation function:
See also posts by tag or search with DuckDuckGo:
re.prefixmatch() instead of re.match() from Python 3.15Take this validation function:
SyntaxWarning: invalid octal escape sequenceTake this code:
TypeError: NamedTuple() got an unexpected keyword argumentTake this code, defining a small NamedTuple with a keyword argument per field:
New package just landed!
Back in January, I introduced tprof, a targeting profiler for Python 3.12+ that measures the time spent in specific functions, rather than your whole program. As a reminder, here’s the basic usage, specifying a target function with -t and a script to run:
It’s another day, another new package day here. Say hello to django-msgspec, a package of drop-in replacements for Django and Django REST Framework (DRF) components backed by msgspec.
git stash -p optimization in Git 2.55I got another commit merged in Git 2.55 (2026-06-29), yay! The release note reads:
ls-treeTo list all files in your repository as they were at a given commit, use git ls-tree with its -r and --name-only options:
(e) or + glob qualifiersZsh glob qualifiers can select files by many built-in attributes: type, size, modification time, and more. But when no built-in qualifier fits, you can bring in the e or + qualifiers to run arbitrary code, making globs a fully programmable file filter. With great power comes great responsibility!
git log with --perl-regexpgit log has an --author option to limit the output to commits from matching authors:
(m0) glob qualifiersMy downloads directory is a junk pile that I just never get around to fully clearing. So if I’ve just downloaded a bunch of files, I normally want to work with them and ignore the rest of the files.
time-machine is my library for mocking the current date and time in Python tests. Its headline advantage over freezegun, the library that inspired it, is speed.
time-machine is my library for mocking the current date and time in Python tests. I’ve just released version 3.3.0 with a decent number of changes, so here’s a lovely summary for you.
ValueError: day of month directive '%d' may not be used without a year directiveTake this code, parsing the date of an annually recurring event that only has a month and day, such as a work anniversary:
TypeError: NotImplemented should not be used in a boolean contextTake this class, which implements __eq__() and derives __ne__() from it:
unittest.mock calls with attached mocksWhen you use a unittest.mock mock, you often make assertions on the calls it received, such as through the mock_calls list. But sometimes you want to assert on the order of calls across multiple mocked functions, for example to check that steps in a process happen in the right sequence.
unittest.mock’s wrapsTesting terminology distinguishes between different kinds of test doubles, including:
Did you know that each Django release has a “code word” associated with it? It’s hidden in plain sight, in the announcement blog post describing the list of features coming in the next version. I think this is a lovely little tradition.
I recently migrated one of my client projects from the legacy django-csp package to Django 6.0’s built-in Content Security Policy (CSP) support (release note). This security header is a powerful tool for preventing unwanted content from being loaded on your site, so configuration correctness is paramount. The migration was fairly straightforward, but a few pages had complicated overrides, so I wanted to be sure that no CSP headers had been changed by my swapping of CSP implementations.
Just as cars painted red are known to be faster, libraries implemented in Rust are also known to be faster. Today’s example is orjson, a Rusty replacement for Python’s built-in json module, boasting 10x faster serialization and 2x faster deserialization.
gc.get_objects()Here’s a lovely hack that I’ve used when machete-mode debugging.
WeakKeyDictionaryIn several programs, I’ve wanted to solve the problem of associating extra data with an object. For example, in django-upgrade, the individual “fixer” functions often want to store extra data per visited ast.Module object.
Back in January, Firefox’s Security & Privacy Newsletter for 2025 Q4 piqued my interest with this mention:
Back in February, I encountered an out-of-memory error while migrating a client project to Python 3.14. The issue occurred when running Django’s database migration command (migrate) on a limited-resource server, and seemed to be caused by the new incremental garbage collection algorithm in Python 3.14.
I’ve made another package! Like icu4py, which I made in February, it was sponsored by my client Rippling. And like tprof, which I made in January, it’s a profiling tool!