Для чего используется __future__ в Python и как / когда его использовать, и как он работает - PullRequest
573 голосов
/ 16 августа 2011

Люди, включая меня, знают, что в Python есть что-то, называемое __future__, и оно встречается в нескольких модулях, которые я читаю.И такие тупые люди, как я, не знают, почему он там, и как / когда его использовать, даже после прочтения Python's __future__ doc .

Итак, кто-нибудь объясняет с примерами, чтобы продемонстрировать это?

У меня есть несколько ответов быстро, которые выглядят все правильно, с точки зрения основного использования.

Однако, а такжедля дальнейшего понимания того, как работает __future__:

Я только что понял одну ключевую вещь, которая смутила меня, когда я пытался понять это, то есть, как в текущем выпуске Python есть что-то, что будет выпущено в будущем выпуске?и как программа, использующая новую функцию в будущем выпуске Python, может быть успешно скомпилирована текущим выпуском Python?

Итак, теперь я предполагаю, что текущий выпуск уже содержит некоторые потенциальные функции, которые будут включены вбудущие релизы - это правильно?но функции доступны только __future__, потому что он еще не стал стандартом - я прав?

Ответы [ 9 ]

319 голосов
/ 16 августа 2011

С включением модуля __future__ вы можете постепенно привыкать к несовместимым изменениям или к таким, которые вводят новые ключевые слова.

Например, для использования контекстных менеджеров вы должны были сделать from __future__ import with_statement в 2.5, так как ключевое слово with было новым и больше не должно использоваться в качестве имен переменных. Чтобы использовать with в качестве ключевого слова Python в Python 2.5 или более ранней версии, вам потребуется использовать импорт сверху.

Другой пример:

from __future__ import division
print 8/7  # prints 1.1428571428571428
print 8//7 # prints 1

Без __future__ оба оператора print выдали бы 1.

Внутренняя разница заключается в том, что без этого импорта / сопоставляется с методом __div__(), а вместе с ним используется __truediv__(). (В любом случае // звонит __floordiv__().)

По поводу print: print становится функцией в 3.x, теряя свое специальное свойство как ключевое слово. Так что все наоборот.

>>> print

>>> from __future__ import print_function
>>> print
<built-in function print>
>>>
169 голосов
/ 16 августа 2011

Когда вы делаете

from __future__ import whatever

На самом деле вы используете не import оператор, а оператор будущего .Вы читаете не те документы, поскольку вы на самом деле не импортируете этот модуль.

Будущие операторы особенные - они изменяют способ анализа вашего модуля Python, поэтому должны быть в верхней части файла.Они дают новое - или другое - значение для слов или символов в вашем файле.Из документов:

Будущее утверждение - это указание компилятору, что определенный модуль должен быть скомпилирован с использованием синтаксиса или семантики, которые будут доступны в указанном будущем выпуске Python.Будущее утверждение предназначено для облегчения перехода на будущие версии Python, которые вносят несовместимые изменения в язык.Это позволяет использовать новые функции для каждого модуля до выпуска, в котором эта функция становится стандартной.

Если вы действительно хотите импортировать модуль __future__, просто выполните

import __future__

, а затем получите к нему доступ как обычно.

103 голосов
/ 21 февраля 2013

__future__ - это псевдомодуль, который программисты могут использовать для включения новых языковых функций, несовместимых с текущим интерпретатором . Например, выражение 11/4 в настоящее время оценивается как 2. Если модуль, в котором он выполняется, включил истинное деление, выполнив:

from __future__ import division

выражение 11/4 будет равно 2.75. Импортируя модуль __future__ и оценивая его переменные, вы можете видеть, когда новая функция была впервые добавлена ​​в язык и когда она станет значением по умолчанию:

  >>> import __future__
  >>> __future__.division
  _Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
43 голосов
/ 16 августа 2011

Может использоваться для использования функций, которые появятся в более новых версиях при наличии более старой версии Python.

Например

>>> from __future__ import print_function

позволит вам использовать print как функцию:

>>> print('# of entries', len(dictionary), file=sys.stderr)
24 голосов
/ 15 ноября 2012

Или это все равно, что сказать "Поскольку это Python v2.7, используйте эту другую функцию 'print', которая также была добавлена ​​в python v2.7, после того, как она была добавлена ​​в python 3. Так что мой 'print' не будет более длинные операторы (например, print «message»), но функции (например, print («message», options)). Таким образом, когда мой код выполняется на python 3, «print» не сломается. "

В

from __future__ import print_function

print_function - это модуль, содержащий новую реализацию 'print' в соответствии с его поведением в Python v3.

Это имеет больше объяснений: http://python3porting.com/noconv.html

21 голосов
/ 11 марта 2018

Уже есть несколько хороших ответов, но ни один из них не рассматривает полный список того, что в настоящее время поддерживает оператор __future__.

Проще говоря, оператор __future__ вынуждает интерпретаторы Python использовать новые функцииязыка.

В настоящее время поддерживаются следующие функции:

nested_scopes:

До Python 2.1 следующий код вызывал бы NameError :

def f():
    ...
    def g(value):
        ...
        return g(value-1) + 1
    ...

Директива from __future__ import nested_scopes разрешит включение этой функции.

generators:

Введенные функции генераторанапример, приведенное ниже для сохранения состояния между последовательными вызовами функций:

def fib():
    a, b = 0, 1
    while 1:
       yield b
       a, b = b, a+b

division:

Классическое разделение используется в версиях Python 2.x.Это означает, что некоторые операторы деления возвращают разумное приближение к делению («истинное деление»), а другие возвращают слово («деление по полу»).Начиная с Python 3.0, истинное деление задается x/y, тогда как деление пола задается x//y.

Директива from __future__ import division заставляет использовать разделение по стилю Python 3.0.

absolute_import:

Позволяет скобкам заключать в себе несколько операторов import.Например:

from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text,
    LEFT, DISABLED, NORMAL, RIDGE, END)

Вместо:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text, \
    LEFT, DISABLED, NORMAL, RIDGE, END

Или:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text
from Tkinter import LEFT, DISABLED, NORMAL, RIDGE, END

with_statement:

Добавляет оператор "с"в качестве ключевого слова в Python, чтобы исключить необходимость try/finally операторов.Обычно это используется при выполнении файлового ввода-вывода, например:

with open('workfile', 'r') as f:
     read_data = f.read()

print_function:

Принудительное использование вызова функции print в скобках вместо Python 3 вместо функцииОператор печати в стиле print MESSAGE.

unicode_literals:

Вводит буквальный синтаксис для объекта bytes.Это означает, что такие выражения, как bytes('Hello world', 'ascii'), могут быть просто выражены как b'Hello world'.

generator_stop:

Заменяет использование исключения StopIteration, используемого внутри функций генератора, на RuntimeError исключение.

Еще одно использование, не упомянутое выше, заключается в том, что оператор __future__ также заставляет использовать интерпретаторы Python 2.1+, поскольку использование более старой версии вызовет исключение времени выполнения.

Ссылки:

4 голосов
/ 05 января 2016

Одним из применений, которое я считаю очень полезным, является модуль print_function из __future__.

В Python 2.7 я хотел, чтобы символы из разных операторов print печатались в одной строке без пробелов.

Это может быть сделано через запятую (",") в конце, но также добавляет дополнительный пробел.Вышеприведенное выражение при использовании в качестве:

from __future__ import print_function
...
print (v_num,end="")
...

Это будет печатать значение v_num из каждой итерации в одной строке без пробелов.

0 голосов
/ 12 апреля 2019

Явное лучше, чем неявное

from __future__ import braces
  File "<stdin>", line 1
SyntaxError: not a chance

[Кредит: @mdeous]

0 голосов
/ 05 апреля 2016

После Python 3.0, print больше не просто оператор, а функция.и включен в PEP 3105.

Также я думаю, что пакет Python 3.0 все еще обладает этими специальными функциями.Давайте посмотрим на его удобство использования через традиционную «программу Pyramid» в Python:

from __future__ import print_function

class Star(object):
    def __init__(self,count):
        self.count = count

    def start(self):
        for i in range(1,self.count):
            for j in range (i): 
                print('*', end='') # PEP 3105: print As a Function 
            print()

a = Star(5)
a.start()

Output:
*
**
***
****

Если мы будем использовать обычную функцию печати, мы не сможем добиться того же результата, так как print () поставляется с дополнительнымновая линия.Поэтому каждый раз, когда выполняется внутренний цикл for, он выводит * на следующую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...