While writing Nuitka I get to see an absurd amount of CPython code. For a while now, it's also CPython3.2 that I look at. Checking out __future__ handling, I was surprised the other day though, this really works:
# Python 3.2.3 (default, Jun 25 2012, 23:10:56) # [GCC 4.7.1] on linux2 >>> from __future__ import barry_as_FLUFL >>> 1 <> 2 True >>> 1 != 2 File "<stdin>", line 1 1 != 2 ^ SyntaxError: invalid syntax
It's new in CPython3, and this the code that makes it possible, from the Python parser:
if (type == NOTEQUAL) { if (!(ps->p_flags & CO_FUTURE_BARRY_AS_BDFL) && strcmp(str, "!=")) { PyObject_FREE(str); err_ret->error = E_SYNTAX; break; } else if ((ps->p_flags & CO_FUTURE_BARRY_AS_BDFL) && strcmp(str, "<>")) { PyObject_FREE(str); err_ret->text = "with Barry as BDFL, use '<>' " "instead of '!='"; err_ret->error = E_SYNTAX; break; } }
Now who would think bad of that, would you? The fun aspect is, that Nuitka will easily supports it. By re-using the Python parser, it works out of the box, I only needed to add the flag value.
For fun, I tried to add a test that confirms - and then notice:
- It doesn't really work for CPython3.2 already.
- The flag is only used for eval and exec and not on the same level, so it's only inherited.
- And "2to3" kindly removes that flag silently. It probably should raise an error.
So yeah, oddities in Python3!