There's no right or wrong, especially in gamedev. Some sayings even go as far as "There are well written games and there are released games"
As programmers we're drawn to "solving" problems, thus being able to create nice systems that handle game data in an efficient way, seems like a great solution, but this work needs to be balanced against actually creating the game itself.
My personal take on this is that unless something is hindering you on creating the game, I would just continue with the most straightforward way for you.
This not only prevents you from falling into the "engineering" trap, but it will also help you to solve problems that matter, instead of creating things that you think you need, only to realize later that the underlying problem, was actually something totally different.
The reason Lua and JSON are common options to for scripting or storing data, is that they are "simple" formats, have a wide range of available libraries, lots of people know how to work with it.
I'm sure you can use Python for your scripting as well, if you can find a library to help with that.
For file formats, I recommend to use a well-known format, be it JSON, YAML, TOML, etc. as it makes it easier to work with, e.g. if you want to use another application to read it. There are also great libraries out there to parse it and work with it, so you don't have to write a whole parser.
For storage you can also consider using SQLite, which allows you to not only store data, but also define relations, e.g. what weapons are available for which level upgrade while retaining a complete list of the weapons.
Or in the end you can just create a few more lists with the necessary information. Or dynamically filter the wanted weapons from the primary list into a smaller list to display.