Origin and history of token-utils ================================= This is likely going to be of very little interest to anyone, except perhaps for budding programmers who are not sure that the programming experiments they do are worthwhile. If this is you, I have a message: **yes**, anything you do for learning is worthwhile. .. sidebar:: Note to self? As I was writing this documentation, I often felt the need to explain why a certain feature of token-utils existed, going into some details about the reasoning for it. This lead me, mostly for my own curiosity, to try to figure out how it began and evolve. As I was starting to put things together, I thought I should write down the full history. .. error:: The rest of this document is currently just a "brain dump" with various links. A coherent text will eventually be written. Talk about starting to program in 2004, wanting to motivate my children to learn programming using a desktop application I created to teach myself Python: `RUR-PLE `_ RUR-PLE eventually supported 8 languages. It has been used (and still is!) in many schools, including many elementary schools in Korea with books written by Samsung as `I reported on my blog `_ in 2014. In that same blog post, I announced the creation of `Reeborg's World `_ a significantly improved version of RUR-PLE, running entirely in a browser, and thus removing the need to install anything on a computer. Reeborg's World is still very much in use today. Two months later, I announced the availability of a French version, where the basic robot commands, such as ``move()``, ``turn_left()``, etc., were translated, but the rest was still straight Python. Somewhere along the way, I added the possibility to write:: repeat n: # code block as equivalent to:: for _ in range(n): # code block In 2015, I started to play with import hooks how to add similar new constructs in Python. https://aroberge.blogspot.com/2015/10/from-experimental-import-somethingnew.html In 2018, I started working on `AvantPy `_ AvantPy is now defunct as I found out that `Hedy `_ did such a much better job at teaching programming using Python-like constructs in a huge number of human languages. I wrote token-utils first as a module integrated within `ideas `_ Before I completely shelved AvantPy, I started working on `friendly/friendly-traceback `_ in 2019. In 2020, I started working on ideas. I wrote at the time in the readme file *As I find myself doing a lot of copy/paste/modify on the various import hooks experiments, including on some published projects such as AvantPy, I thought it would make sense to create a versatile projects which I could use as the basis of other projects. An obvious benefit is that I will need to fix bugs in a single project.* I was partly inspired by the following: In Feb. 21, 2020, on the Python-ideas mailing list, Andrew Barnert, a Python code developer, `wrote `_: *Unfortunately, the boilerplate to write an import hook is more complicated than you’d like (and pretty hard to figure out the first time),* **and the support for filtering on the token stream (the most obvious way to do this one)** *rather than the text stream, AST, or bytecode* **is pretty minimal and clumsy.** [emphasis added] I made some quick progress, and initially created token-utils as a module within it. When I talked about ideas in a tread on Python-ideas, the same Andrew Barnert `also wrote `_ to a message writing the following about token-utils as an existing module within **ideas** : *First, one of the parts that always blocked me was coming up with a good way to write token-level transformers. It looks like you solved that; maybe it’s worth pulling the tokenizer tools out into a separate library to post on PyPI separately?* This motivated me to turn token-utils on its own project available on Pypi. It quickly become mature and did not change between the end of 2020 and the middle of 2026. I wrote token-utils first as a module integrated within `ideas `_ While **ideas** aims to provide support for all kinds of transformations, including those that affect the Abstract Syntax Tree or the bytecode, most transformations deal with exploring alternative syntax that is not compatible with Python's current syntax defined by its `grammar `_. Such alternative syntax cannot be parsed by Python without generating a ``SyntaxError`` thus preventing the execution of the code. For this reason, almost all of our examples transform the code prior to letting Python parse it. We do this using a set of tools built upon Python's `tokenize module `_. In the meantime, I incorporated a version of it (rather than having it as an external requirement) within friendly/friendly-traceback where I focused on adding methods and functions not focused on code-transformation, but rather in helping replace the dreaded ``SyntaxError: invalid syntax`` by more appropriate and helpful description of the exact cause of the problem and offering possible solutions.