__future__
aparece frequentemente nos módulos Python. Eu não entendo o que __future__
é e como / quando usá-lo, mesmo depois de ler o __future__
documento do Python .
Alguém pode explicar com exemplos?
Algumas respostas sobre o uso básico __future__
que recebi pareciam corretas.
No entanto, preciso entender mais uma coisa sobre como __future__
funciona:
O conceito mais confuso para mim é como uma versão atual do python inclui recursos para versões futuras e como um programa que usa um recurso de uma versão futura pode ser compilado com êxito na versão atual do Python.
Eu estou supondo que a versão atual seja empacotada com recursos potenciais para o futuro. No entanto, os recursos estão disponíveis apenas pelo uso, __future__
porque não são o padrão atual. Deixe-me saber se estou certo.
fonte
Respostas:
Com
__future__
a inclusão do módulo, você pode se acostumar lentamente a alterações incompatíveis ou a introduzir novas palavras-chave.Por exemplo, para usar gerenciadores de contexto, você precisava fazer isso
from __future__ import with_statement
na versão 2.5, pois awith
palavra - chave era nova e não deveria mais ser usada como nome de variável. Para usarwith
como uma palavra-chave Python no Python 2.5 ou mais antiga, você precisará usar a importação de cima.Outro exemplo é
Sem o
__future__
material, ambas asprint
instruções seriam impressas1
.A diferença interna é que, sem essa importação,
/
é mapeado para o__div__()
método, enquanto ele__truediv__()
é usado. (Em qualquer caso,//
chamadas__floordiv__()
.)Apropos
print
:print
torna - se uma função no 3.x, perdendo sua propriedade especial como uma palavra-chave. Portanto, é o contrário.fonte
from __future__ import braces
: pprint
é definitivamente uma função, mas pode haver outros recursos que podem ser usados__future__
. (Edit: see docs.python.org/3/library/__future__.html onde ainda é usado.)Quando você faz
Na verdade, você não está usando uma
import
declaração, mas uma declaração futura . Você está lendo os documentos errados, pois não está realmente importando esse módulo.As instruções futuras são especiais - elas mudam a maneira como seu módulo Python é analisado, e é por isso que elas devem estar no topo do arquivo. Eles dão um significado novo - ou diferente - às palavras ou símbolos do seu arquivo. Dos documentos:
Se você realmente deseja importar o
__future__
módulo, bastae depois acesse-o normalmente.
fonte
from __future__ import print_function
tanto altera o comportamento daprint
palavra-chave e tem um tempo de execução afetar equivalente aprint_function = __import__("__future__").print_function
__future__
é um pseudo-módulo que os programadores podem usar para habilitar novos recursos de idioma que não são compatíveis com o intérprete atual . Por exemplo, a expressão11/4
atualmente é avaliada como2
. Se o módulo em que é executado ativou a divisão verdadeira executando:from __future__ import division
a expressão
11/4
seria avaliada como2.75
. Ao importar o__future__
módulo e avaliar suas variáveis, é possível ver quando um novo recurso foi adicionado pela primeira vez ao idioma e quando ele se tornará o padrão:fonte
import __future__ xyz
não é uma opção?Ele pode ser usado para usar recursos que aparecerão em versões mais recentes enquanto houver uma versão mais antiga do Python.
Por exemplo
permitirá que você use
print
como uma função:fonte
Já existem ótimas respostas, mas nenhuma delas trata de uma lista completa de quais
__future__
declaração atualmente suporta.Simplificando, a
__future__
declaração força os intérpretes Python a usar recursos mais recentes da linguagem.Os recursos que ele suporta atualmente são os seguintes:
nested_scopes
Antes do Python 2.1, o código a seguir geraria um NameError :
A
from __future__ import nested_scopes
diretiva permitirá que esse recurso seja ativado.generators
Funções de gerador introduzidas, como a abaixo, para salvar o estado entre chamadas de função sucessivas:
division
A divisão clássica é usada nas versões do Python 2.x. Significando que algumas declarações de divisão retornam uma aproximação razoável da divisão ("divisão verdadeira") e outras retornam o piso ("divisão do piso"). A partir do Python 3.0, a divisão verdadeira é especificada por
x/y
, enquanto a divisão do piso é especificada porx//y
.A
from __future__ import division
diretiva força o uso da divisão de estilo Python 3.0.absolute_import
Permite que parênteses incluam várias
import
instruções. Por exemplo:Ao invés de:
Ou:
with_statement
Adiciona a instrução
with
como uma palavra-chave no Python para eliminar a necessidade detry/finally
instruções. Usos comuns disso são ao executar E / S de arquivo, como:print_function
:Força o uso da
print()
chamada de função no estilo parêntese do Python 3 em vez daprint MESSAGE
declaração de estilo.unicode_literals
Introduz a sintaxe literal do
bytes
objeto. Significando que declarações comobytes('Hello world', 'ascii')
podem ser simplesmente expressas comob'Hello world'
.generator_stop
Substitui o uso da
StopIteration
exceção usada nas funções do gerador pelaRuntimeError
exceção.Um outro uso não mencionado acima é que a
__future__
instrução também requer o uso de intérpretes Python 2.1+, pois o uso de uma versão mais antiga gera uma exceção de tempo de execução.Referências
fonte
Ou é como dizer "Como esse é o python v2.7, use a função 'print' diferente que também foi adicionada ao python v2.7, depois que foi adicionada no python 3. Portanto, meu 'print' não será mais uma declaração (por exemplo, print "message"), mas funciona (por exemplo, print ("message", options). Dessa forma, quando meu código é executado no python 3, 'print' não será interrompido. "
No
print_function é o módulo que contém a nova implementação de 'print', como está se comportando no python v3.
Isso tem mais explicações: http://python3porting.com/noconv.html
fonte
Um dos usos que eu achei muito úteis é o módulo
print_function
from__future__
.No Python 2.7, eu queria que caracteres de diferentes instruções de impressão fossem impressos na mesma linha sem espaços.
Isso pode ser feito usando uma vírgula (",") no final, mas também acrescenta um espaço extra. A declaração acima quando usada como:
Isso imprimirá o valor de
v_num
cada iteração em uma única linha sem espaços.fonte
Após o Python 3.0 em diante, print não é mais apenas uma declaração, é uma função. e está incluído no PEP 3105.
Também acho que o pacote Python 3.0 ainda possui essas funcionalidades especiais. Vamos ver sua usabilidade através de um "programa Pyramid" tradicional em Python:
Se usarmos a função de impressão normal, não conseguiremos obter a mesma saída, pois print () vem com uma nova linha extra. Assim, sempre que o loop for interno for executado, ele será impresso * na próxima linha.
fonte