Don't allow `micropython.const`
This came up in https://github.com/micropython/micropython-lib/pull/693
It does seem reasonable to expect that A = micropython.const(1) should do the right thing, but it only works if you write A = const(1). I would argue that the former should raise an error or otherwise indicate that it's not doing anything useful.
We need to support from micropython import const because this facilitates:
- Running MicroPython code on CPython (where you have a
micropython.pythat provides a dummyconstfunction). - On builds with
MICROPY_COMP_CONSTdisabled (e.g. when settrace is enabled) there will be no "magic" const, so it needs to be imported.
I think 791b65f4b261a23e427664f0b86ce32b60e33cb5 confirms the above.
Some ideas:
- We could change
parse.cto turnconst(...)into a no-op, rather than not handling it at all whenMICROPY_COMP_CONSTis disabled. (I never realised until today that we had this implicit requirement to usefrom micropython import constto be able to useconst()in all builds, I have written a lot of .py files that don't do this!). Thenmicropython.constshould no longer be the identity function (it should raise an error).
or
- Only if
MICROPY_COMP_CONSTis enabled, thenmicropython.constshould no longer be the identity function (it should raise an error to indicate incorrect usage).
or
- Make the parser also handle
micropython.const.
My preference would be #1. Instead of making micropython.const raise an error, it could also just be None (enough to make the import work), but then it might be a bit confusing to figure out why it's failing.
Providing support for constants in Python code
I told there's optimization itch... (again, or finally). So, we discussed this already, and there's support for native modules already, so can we have:
from micropython import const
VAL = const(100)
After that, VAL is subject to constant propagation per existing compiler support. Initial implementation can do just intra-module propagation.