__future__
często pojawia się w modułach Python. Nie rozumiem, co __future__
jest i jak / kiedy go używać nawet po przeczytaniu pytona jest __future__
doc .
Czy ktoś może wyjaśnić za pomocą przykładów?
Kilka odpowiedzi dotyczących podstawowego użycia __future__
, które otrzymałem, wydawało się poprawnych.
Muszę jednak zrozumieć jeszcze jedną rzecz dotyczącą __future__
działania:
Najbardziej mylące jest dla mnie pojęcie, w jaki sposób obecne wydanie Pythona zawiera funkcje dla przyszłych wydań oraz w jaki sposób program korzystający z funkcji z przyszłego wydania może zostać pomyślnie skompilowany w bieżącej wersji Pythona.
Domyślam się, że obecne wydanie zawiera potencjalne funkcje na przyszłość. Jednak funkcje są dostępne tylko przy użyciu, __future__
ponieważ nie są bieżącym standardem. Daj mi znać, jeśli mam rację.
źródło
Odpowiedzi:
Z
__future__
dołączeniu modułu możesz powoli przyzwyczaić się do niezgodnych zmian lub do wprowadzania nowych słów kluczowych.Na przykład, aby użyć menedżerów kontekstu, trzeba było zrobić
from __future__ import with_statement
w 2.5, jakowith
słowo kluczowe było nowe i nie powinno być dłużej używane jako nazwy zmiennych. W celu wykorzystaniawith
jako słowa kluczowego Python w Python 2.5 lub starszym, musisz użyć importu z góry.Innym przykładem jest
Bez tych
__future__
rzeczy obaprint
wydrukowano by oświadczenia1
.Wewnętrzna różnica polega na tym, że bez tego importu
/
jest odwzorowywany na__div__()
metodę, podczas gdy z nią__truediv__()
jest używany. (W każdym razie//
połączenia__floordiv__()
.)Apropos
print
:print
staje się funkcją w 3.x, tracąc swoją specjalną właściwość jako słowo kluczowe. Tak jest na odwrót.źródło
from __future__ import braces
: pprint
jest zdecydowanie funkcją, ale mogą istnieć inne funkcje, które mogą się przydać__future__
. (Edytuj: patrz docs.python.org/3/library/__future__.html, gdzie jest nadal używany.)Kiedy to zrobisz
W rzeczywistości nie używasz
import
wyciągu, ale wyciąg w przyszłości . Czytasz złe dokumenty, ponieważ tak naprawdę nie importujesz tego modułu.Przyszłe instrukcje są wyjątkowe - zmieniają sposób analizowania modułu Pythona, dlatego muszą znajdować się na górze pliku. Nadają nowe - lub inne - znaczenie słowom lub symbolom w twoim pliku. Z dokumentów:
Jeśli naprawdę chcesz zaimportować
__future__
moduł, po prostu zróba następnie uzyskaj do niego dostęp jak zwykle.
źródło
from __future__ import print_function
oba zmieniają zachowanieprint
słowa kluczowego i mają wpływ na środowisko wykonawcze naprint_function = __import__("__future__").print_function
__future__
to pseudomoduł, którego programiści mogą używać do włączania nowych funkcji językowych, które nie są kompatybilne z bieżącym tłumaczem . Na przykład wyrażenie11/4
obecnie ocenia na2
. Jeśli moduł, w którym jest wykonywany, umożliwił prawdziwy podział, wykonując:from __future__ import division
wyrażenie
11/4
to ocenia2.75
. Importując__future__
moduł i oceniając jego zmienne, możesz zobaczyć, kiedy po raz pierwszy dodano nową funkcję do języka i kiedy stanie się ona domyślną:źródło
import __future__ xyz
to nie jest możliwe?Można go używać do korzystania z funkcji, które pojawią się w nowszych wersjach, mając starszą wersję Pythona.
Na przykład
pozwoli ci używać
print
jako funkcji:źródło
Istnieje już kilka świetnych odpowiedzi, ale żadna z nich nie odnosi się do pełnej listy tego, co
__future__
oświadczenie obecnie obsługuje.Mówiąc prościej, oświadczenie zmusza tłumaczy Python użyć nowszych funkcji języka.
__future__
Funkcje, które obecnie obsługuje to:
nested_scopes
Przed wersją Python 2.1 następujący kod wywoływałby błąd NameError :
from __future__ import nested_scopes
Dyrektywa pozwoli tej funkcji była włączona.generators
Wprowadzono funkcje generatora, takie jak ta poniżej, aby zapisać stan pomiędzy kolejnymi wywołaniami funkcji:
division
Klasyczny podział jest używany w wersjach Python 2.x. Oznacza to, że niektóre stwierdzenia podziału zwracają rozsądne przybliżenie podziału („podział prawdziwy”), a inne zwracają piętro („podział podłogi”). Począwszy od Python 3.0, prawdziwy podział jest określony przez
x/y
, podczas gdy podział podłogi jest określony przezx//y
.Do
from __future__ import division
dyrektywa wymusza stosowanie Python 3.0 stylu Division.absolute_import
Pozwala na umieszczenie w nawiasie wielu
import
instrukcji. Na przykład:Zamiast:
Lub:
with_statement
Dodaje instrukcję
with
jako słowo kluczowe w Pythonie, aby wyeliminować potrzebętry/finally
instrukcji. Typowe zastosowania tego są podczas wykonywania operacji we / wy pliku, takich jak:print_function
:Wymusza użycie
print()
wywołania funkcji w nawiasie w stylu Python 3 zamiast instrukcjiprint MESSAGE
stylu.unicode_literals
Wprowadza dosłowną składnię dla
bytes
obiektu. Oznacza to, że takie stwierdzeniabytes('Hello world', 'ascii')
można po prostu wyrazić jakob'Hello world'
.generator_stop
Zastępuje
StopIteration
wyjątek zastosowany w funkcjach generatoraRuntimeError
.Innym niewymienionym powyżej zastosowaniem jest to, że
__future__
instrukcja wymaga również użycia interpreterów języka Python 2.1+, ponieważ użycie starszej wersji spowoduje zgłoszenie wyjątku czasu wykonywania.Bibliografia
źródło
A może to tak, jakby powiedzieć „Ponieważ jest to python v2.7, użyj innej funkcji„ print ”, która została również dodana do python v2.7, po tym jak została dodana w python 3. Zatem moje„ print ”nie będzie już instrukcjami (np. print „wiadomość”), ale funkcje (np. print („wiadomość”, opcje)). W ten sposób, gdy mój kod jest uruchamiany w Pythonie 3, „print” nie ulegnie uszkodzeniu. ”
W
print_function to moduł zawierający nową implementację 'print', zgodnie z tym, jak zachowuje się w Pythonie v3.
To ma więcej wyjaśnień: http://python3porting.com/noconv.html
źródło
Jednym z zastosowań, które uznałem za bardzo przydatne, jest moduł
print_function
from__future__
.W Pythonie 2.7 chciałem, aby znaki z różnych instrukcji print były drukowane w tym samym wierszu bez spacji.
Można to zrobić za pomocą przecinka („,”) na końcu, ale dodaje on również dodatkowe miejsce. Powyższe stwierdzenie używane jako:
Spowoduje to wydrukowanie wartości
v_num
z każdej iteracji w jednym wierszu bez spacji.źródło
Począwszy od Python 3.0, print nie jest już tylko instrukcją, lecz funkcją. i jest uwzględniony w PEP 3105.
Myślę też, że pakiet Python 3.0 nadal ma te specjalne funkcje. Zobaczmy jego użyteczność poprzez tradycyjny „program Pyramid” w Pythonie:
Jeśli użyjemy normalnej funkcji drukowania, nie będziemy w stanie osiągnąć tego samego wyniku, ponieważ print () ma dodatkową linię nowego wiersza. Dlatego za każdym razem, gdy wykonywana jest wewnętrzna pętla for, drukuje * w następnym wierszu.
źródło