UHMIS
UHMIS

Reputation: 1789

Why does using "from __future__ import print_function" break Python2-style print?

I tried this code in Python 2.7:

from __future__ import print_function
import sys, os, time

for x in range(0,10):
    print x, sep=' ', end=''
    time.sleep(1)

But I get an error that says:

$ python2 xy.py
  File "xy.py", line 5
    print x, sep=' ', end=''
          ^
SyntaxError: invalid syntax
$

I thought that using the __future__ import should make it possible to use sep and end in a print statement, but now it apparently doesn't work at all.

Why not?

Upvotes: 166

Views: 296086

Answers (1)

Cyphase
Cyphase

Reputation: 12022

The whole point of from __future__ import print_function is to bring the print function from Python 3 into Python 2.6+. Thus, it must be used like a function here:

from __future__ import print_function

import sys, os, time

for x in range(0,10):
    print(x, sep=' ', end='')  # No need for sep here, but okay :)
    time.sleep(1)

__future__ statements change fundamental things about the language. From the documentation:

A future statement is recognized and treated specially at compile time: Changes to the semantics of core constructs are often implemented by generating different code. It may even be the case that a new feature introduces new incompatible syntax (such as a new reserved word), in which case the compiler may need to parse the module differently. Such decisions cannot be pushed off until runtime.

(For the same reason, they must also appear first in the source code, before any other imports. The only things that can precede a __future__ statement are the module docstring, comments, blank lines, and other future statements.)

Upvotes: 265

Related Questions