Что такое __future__ в Python, который используется и как/когда его использовать, и как он работает

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

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

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

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

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

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

Ответ 1

С включением модуля __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>
>>>

Ответ 2

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

from __future__ import whatever

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

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

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

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

import __future__

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

Ответ 3

__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)

Ответ 4

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

Например

>>> from __future__ import print_function

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

>>> print('# of entries', len(dictionary), file=sys.stderr)

Ответ 5

Уже есть несколько __future__ ответов, но ни один из них не содержит полного списка того, что в настоящее время поддерживает оператор __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:

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

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

print_function:

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

unicode_literals:

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

generator_stop:

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

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

Рекомендации:

Ответ 6

Или это как сказать "Поскольку это Python v2.7, используйте эту другую функцию" печать ", которая также была добавлена в 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

Ответ 7

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

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

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

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

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

Ответ 8

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

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

[Предоставлено: @mdeous]

Ответ 9

После Python 3.0, печать уже не просто оператор, а его функция. и включен в 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() имеет дополнительную строку новой строки. Поэтому каждый раз, когда выполняется цикл inner for, он печатает * на следующей строке.