QR Code encoder

This is a Version 1 QR Code encoder that I have written and presented as a final project for school. The "Version" notation refers to the size (in number of modules) of the QR Code; the bigger the Version, the more data the QR Code can store.
It is a basic encoder that implements all eight masking patterns, all four error correction levels (L, M, Q, H) and Byte encoding mode. There is a lot of debugging information printed (it can be disabled) and the code is pretty well commented, if it helps someone. Support for other encoding modes can be added pretty trivially. On the other hand, implementing other QR Code versions would be a bit more difficult as there are a lot of places which expect a Version 1 symbology.
Nearly all of the encoder was written by hand, without any other help than the ISO 18004:2015 standard (and a little help from the internet for ambiguous parts). For generation of the format information error correction bits, I used the galois library to generate a BCH code over our Galois field of 2^8. Also, I didn't have time to figure out generation of error correction codewords, so I had to resort to copying out this code from this awesome QR Code generator library (licensed under the MIT license).
Running
Create a Python 3 venv, install all requirements, enter the venv and run!
mkdir venv
python3 -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt
python3 qr_code.py --help
Have fun !
