-
-
Notifications
You must be signed in to change notification settings - Fork 33k
Description
The check for whether there are __future__
imports which are not in the beginning of the script appears in two places:
in future.c, future_parse, the ff_lineno is stored (last lineno of a __future__
import) and there is a check for bad __future__
imports on the same line .
Then in compile.c, compiler_from_import(), any import from __future__
which is in a line after c->c_future->ff_lineno
is rejected.
If we replace ff_lineno by ff_location (the complete location information) then the check in compile.c can use the column info to detect the same-line case, and we no longer need to check for this in future.c. The code of future_parse will become much simpler.
There is also a bug in the future.c exception - the offset is off by 1, and this results in incorrect hilighting of the bad import:
python.exe -c "import test.badsyntax_future7.py"
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/Users/iritkatriel/src/cpython/Lib/test/badsyntax_future7.py", line 3
from __future__ import nested_scopes; import string; from __future__ import \
^
SyntaxError: from __future__ imports must occur at the beginning of the file
My patch will result in this output instead:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/Users/iritkatriel/src/cpython-654/Lib/test/badsyntax_future7.py", line 3
from __future__ import nested_scopes; import string; from __future__ import \
^^^^^^^^^^^^^^^^^^^^^^^^
SyntaxError: from __future__ imports must occur at the beginning of the file