death and gravity
Hi, I'm Adrian. Among other things, I write about Python on the internet.
I also maintain reader, a Python feed reader library.
If you're new here, people seem to like these articles (see more):
- When to use classes in Python? When your functions take the same arguments
- Learn by reading code: Python standard library design decisions explained
- The unreasonable effectiveness of f-strings and re.VERBOSE
- Write an SQL query builder in 150 lines of Python!
Here's a list of all the articles:
-
Today we're implementing a least recently used cache with priorities and expiry, using only the Python standard library. This is a bIG TEch CoDINg InTerVIEW problem, so we'll work hard to stay away from the correct™ data structures, but end up with a decent solution anyway!
-
Having trouble figuring out when to use classes? In this article, we look at another heuristic for using classes in Python, with examples from real-world code, and some things to keep in mind.
-
Running async code from sync in Python asyncio 10 minute read
So, you're doing some sync stuff. But you also need to do some async stuff, without making *everything* async. Hint: asyncio.Runner will get you at least part of the way there.
-
Why you should still read the docs nine minute read
Do you feel you're fighting your tools? Do you feel you're relying too much on autocomplete and inline documentation? tl;dr: Most good documentation won't show up in your IDE – rather, it is about how to use the library, and the problem the library is solving.
-
Java is notoriously verbose, especially when used in a serious Enterprise Project™ ...so naturally, I made linesieve, a Python text munging tool to split output into sections and match/sub/split with the full power of Python's re module.
-
So, you're doing some async stuff, repeatedly, hundreds of thousands of times. How do you *not* do it all at once? Hint: asyncio.Semaphore is not always the best way, despite what Stack Overflow may tell you ;)
-
yaml: while constructing a mapping found unhashable key five minute read
... in which you'll find out what "while constructing a mapping found unhashable key" PyYAML errors mean, why do they happen, and what you can do about it.
-
Caching a lot of methods in Python six minute read
... in which you'll learn how to cache a lot of methods in Python, even for objects created by someone else. Did you know that, contrary to popular belief, Python programmers can have a little monkey patching as a treat?
-
... in which we check if your password has been compromised in many inconvenient ways, in a tale of destruction, obsession, and self-discovery.
-
The unreasonable effectiveness of f-strings and re.VERBOSE seven minute read
... in which we look at one or two ways to make life easier when working with Python regular expressions.
-
yaml: could not determine a constructor for the tag four minute read
... in which you'll find out what "could not determine a constructor for the tag" PyYAML errors mean, why do they happen, and what you can do about it.
-
Dealing with YAML with arbitrary tags in Python 10 minute read
... in which we use PyYAML to safely read and write YAML with any tags, in a way that's as straightforward as interacting with built-in types.
-
Write an SQL query builder in 150 lines of Python! 20 minute read
This is the fourth article in a series about writing my own SQL query builder. Today, we'll rewrite it from scratch, explore API design, learn when to be lazy, and look at worse and better ways of doing things – all in 150 lines of Python!
-
namedtuple in a post-dataclasses world six minute read
namedtuple has been around since forever, and over time, its convenience saw it used far outside its originally intended purpose. With dataclasses now covering part of those use cases, what should one use named tuples for? In this article, I address this question, and give a few examples from real code.
-
Why I wrote my own SQL query builder (in Python) 10 minute read
This is the third article in a series about writing an SQL query builder in 150 lines of Python. Here, I talk about why I decided to write my own, the alternatives I considered, why I didn't use an existing library, and how I knew it wouldn't become a maintenance burden.
-
In this article, we look at a few real-world examples where functions taking the same arguments don't necessarily make a class, as counter-examples to a heuristic for using classes in Python.
-
Python sentinel objects, type hints, and PEP 661 seven minute read
PEP 661 proposes adding a utility for defining sentinel values in the Python standard library. In this article, you'll get a PEP 661 summary, learn what sentinel objects are (with real-world examples), how to use them with type hints, and a bit about why PEPs exist in the first place.
-
In this article, we look at a heuristic for using classes in Python, with examples from real-world code, and some things to keep in mind.
-
Why use an SQL query builder in the first place? eight minute read
This is the second article in a series about writing an SQL query builder in 150 lines of Python, why I wrote it, how I thought about it, and the decisions I had to make. In this article, I talk about why I needed a query builder in the first place, with examples derived from real use cases I had for my feed reader library.
-
SQL query builder in 150 lines of Python two minute read
In this series, we examine an SQL query builder I wrote in 150 lines of Python, why I wrote it, how I thought about it, and the decisions I had to make. This article is a sneak peek of the series and the code.
-
... in which we look at an interesting alternative to Makefiles with .PHONY-only targets, and why I think it's cool.
-
hashlib: object supporting the buffer API required three minute read
In this article, you'll find out what Python hashlib "object supporting the buffer API required" TypeErrors mean, why do they happen, and what you can do about it.
-
On your Python learning journey, you may have heard that a great way to get better is to read code written by other people. That's true, but finding good code to study is not easy, mostly because the design philosophy and the reasoning behind the code are rarely documented. The Python standard library is special in this regard: not only is the code open source, but the discussions around the design decisions are public, too.
-
Dataclasses without type annotations six minute read
... in which we talk about the many ways of using Python dataclasses without type annotations (or even variable annotations!), and what this says about Python.
-
Deterministic hashing of Python data objects 10 minute read
In this article, you'll learn how to calculate deterministic hashes for arbitrary Python data objects, stable across interpreter versions and implementations.
-
Are you having trouble making the modules work together in a larger project? Have you tried looking at popular projects as models, but were put off by their size and scope, or found it hard to see why they did the things they did? Resources about this do exist, but they're scattered all over, and might be hard to find for someone early in their programming journey.
-
Optimizing Advent of Code 2020 day 17 13 minute read
... in which we optimize our Advent of Code 2020 day 17 (Conway Cubes) solution, focusing on profiling and optimizing existing code, in a way that helps you translate those skills to your regular, non-puzzle coding. With a touch of code generation and some help from PyPy, we end up with a 65x improvement.
-
Solving Advent of Code 2020 day 17 by not solving it 16 minute read
... in which we solve the day 17 problem from Advent of Code 2020, Conway Cubes, in a generic way, focusing on testing, refactoring, and idiomatic Python, in a way that helps you translate those skills to your regular, non-puzzle coding.
Every once in a while, I summarize the latest reader changes here:
- reader 3.13 released – scheduled updates
- reader 3.12 released – split search index
- reader 3.10 released – storage internal API
- reader 3.9 released – update hook error handling
- reader 3.7 released – contributor docs
- reader 3.4 released – 5 years, 2000 commits
- reader 3.0 released – multithreading
- reader 2.14 released – Twitter, read time
- reader 2.11 released – metadata is tags
- reader 2.5 released – usage statistics
- reader 2.0 released