Why is writing DSLs strictly worse than writing complicated transformations built on top of the limited constructs provided by the language itself? (You said never)
As a simple example, you get some syntax checking.
While mentioned in the post, it's not front-and-center because that's the sort of Python superpower that can look scary to less-experienced devs.
In my experience, it's almost impossible to dissuade people from generating strings if the API affords it. We can't even stop people from generating SQL by concatenation!
Musing: does Python have a way (Mypy?) to declare that a method can accept only constant expressions?