Какие __future__ функции я должен импортировать в Python v2.6.2? - PullRequest
9 голосов
/ 28 марта 2012

Я начинаю изучать Python, но я вынужден использовать интерпретатор v2.6.2.

Я хочу максимально приблизиться к Python 3, например, используя новую функцию print, деление "true" и т. Д.

from __future__ import division
from __future__ import print_function
print(1/2, file=sys.stderr) # 0.5

Какие еще функции я должен импортировать из __future__?

Полагаю, я мог бы сделать общий import __future__, но при переходе на более высокую версию я бы получил другое поведение (v2.7 может иметь больше функций в __future__), и мои сценарии могли бы перестать работать.

Ответы [ 2 ]

7 голосов
/ 28 марта 2012

Какие еще функции я должен импортировать из __future__?

Чтобы получить самое современное поведение, вам, конечно, следует импортировать все предлагаемые __future__ функции, кроме тех, которые вы все равно получаете. (При настройке системы старые функции не удаляются даже после их постоянного включения.)

Обратите внимание, что import __future__ будет не даст вам все, и ни один не будет from __future__ import *. Синтаксис from ... import ... специально разработан для __future__ (именно так он и работает), но __future__ по-прежнему является реальным модулем, который можно импортировать с помощью import __future__. Тем не менее, это позволит вам узнать действительные имена объектов, а также информацию о том, когда они (или, как ожидается, будут) установлены по умолчанию и когда они стали доступны.

>>> [
...     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']

- вот что я получаю на 2.7.2.

7 голосов
/ 28 марта 2012

Ну, даже если не было документации, __future__ также является обычным модулем, который имеет некоторую информацию о себе:

>>> 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 имеет большинство функцийуже включен, поэтому выберите из division, print_function, absolute_import и unicode_literals.

И нет, import __future__ не будет работать, как вы думаете.Это волшебство, только когда вы используете форму from __future__ import something в качестве первого выражения в файле.См. документы .

Конечно, независимо от того, сколько вы импортируете из __future__, вы получите другое поведение в 3.x.

...