The reason is that when you import from __future__ you’re really just setting a flag that tells the interpreter to behave a bit differently than usual — in the case of print_function, the print() function is made available in place of the statement. The __future__ module is thus “special” or “magic” — it doesn’t work like the usual modules.