Reputation: 66254
I am starting to learn Python, but I'm forced to use a v2.6.2 interpreter.
I want to get as close as possible to Python 3, e.g, using the new print
function, "true" division, etc.
from __future__ import division
from __future__ import print_function
print(1/2, file=sys.stderr) # 0.5
What other features should I import from __future__
?
I guess I could do a general import __future__
but then I would get different behavior when I upgrade to a higher version (v2.7 might have more features in __future__
), and my scripts might stop working then.
Upvotes: 9
Views: 3626
Reputation: 61654
What other features should I import from
__future__
?
To get the most up-to-date behaviour, you should of course import every __future__
feature that's offered, except the ones that you get anyway. (The way the system is set up, old features are not dropped even after they're always-on.)
Note that import __future__
will not give you everything, and neither will from __future__ import *
. The from ... import ...
syntax is special-cased for __future__
(which is how it works), but __future__
is still a real module that you can import with import __future__
. However, doing so will let you know the actual feature names, as well as information on when they were (or are expected to be) made default, and when they became available.
>>> [
... name for name in __future__.all_feature_names if
... getattr(__future__, name).optional <=
... sys.version_info <
... getattr(__future__, name).mandatory
... ]
['division', 'print_function', 'unicode_literals']
is what I get on 2.7.2.
Upvotes: 7
Reputation: 67040
Well, even if there wasn't documentation, __future__
is also a regular module that has some info about itself:
>>> import __future__
>>> __future__.all_feature_names
['nested_scopes', 'generators', 'division', 'absolute_import', 'with_statement', 'print_function', 'unicode_literals']
>>> __future__.unicode_literals
_Feature((2, 6, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 131072)
Python 2.6 has most of the features already enabled, so choose from division
, print_function
, absolute_import
and unicode_literals
.
And no, import __future__
won't work as you think. It's only magic when you use the from __future__ import something
form as the first statement in the file. See the docs for more.
Of course, no matter how much you import from __future__
, you will get different behavior in 3.x.
Upvotes: 7