__future__
erscheint häufig in Python-Modulen. Ich verstehe nicht, wofür __future__
und wie / wann ich es verwenden soll, selbst nachdem ich das Python- __future__
Dokument gelesen habe .
Kann jemand mit Beispielen erklären?
Ein paar Antworten bezüglich der grundlegenden Verwendung von, die __future__
ich erhalten habe, schienen richtig zu sein.
Ich muss jedoch noch eines verstehen, wie es __future__
funktioniert:
Das verwirrendste Konzept für mich ist, wie eine aktuelle Python-Version Funktionen für zukünftige Versionen enthält und wie ein Programm, das eine Funktion aus einer zukünftigen Version verwendet, in der aktuellen Version von Python erfolgreich kompiliert werden kann.
Ich vermute, dass die aktuelle Version mit potenziellen Funktionen für die Zukunft gepackt ist. Die Funktionen sind jedoch nur bei Verwendung verfügbar, __future__
da sie nicht dem aktuellen Standard entsprechen. Lassen Sie mich wissen, ob ich recht habe.
quelle
Antworten:
Durch
__future__
die Aufnahme des Moduls können Sie sich langsam an inkompatible Änderungen oder an solche gewöhnen, die neue Schlüsselwörter einführen.Für die Verwendung von Kontextmanagern mussten Sie beispielsweise
from __future__ import with_statement
2.5 ausführen, da daswith
Schlüsselwort neu war und nicht mehr als Variablennamen verwendet werden sollte. Umwith
in Python 2.5 oder älter als Python-Schlüsselwort verwendet zu werden, müssen Sie den Import von oben verwenden.Ein anderes Beispiel ist
Ohne das
__future__
Zeugprint
würden beide Aussagen gedruckt1
.Der interne Unterschied besteht darin, dass ohne diesen Import
/
die__div__()
Methode zugeordnet wird, während sie__truediv__()
verwendet wird. (Auf jeden Fall//
Anrufe__floordiv__()
.)Apropos
print
:print
wird eine Funktion in 3.x und verliert seine spezielle Eigenschaft als Schlüsselwort. So ist es umgekehrt.quelle
from __future__ import braces
: pprint
ist dies definitiv eine Funktion, es können jedoch auch andere Funktionen verwendet werden__future__
. (Bearbeiten: siehe docs.python.org/3/library/__future__.html, wo es noch verwendet wird.)Wenn Sie das tun
Sie verwenden eigentlich keine
import
Aussage, sondern eine zukünftige Aussage . Sie lesen die falschen Dokumente, da Sie dieses Modul nicht importieren.Zukünftige Anweisungen sind etwas Besonderes - sie ändern die Art und Weise, wie Ihr Python-Modul analysiert wird. Deshalb müssen sie oben in der Datei stehen. Sie geben Wörtern oder Symbolen in Ihrer Datei eine neue oder andere Bedeutung. Aus den Dokumenten:
Wenn Sie das
__future__
Modul tatsächlich importieren möchten , tun Sie dies einfachund dann wie gewohnt darauf zugreifen.
quelle
from __future__ import print_function
beide ändern das Verhalten desprint
Schlüsselworts und haben einen Laufzeiteffekt, derprint_function = __import__("__future__").print_function
__future__
ist ein Pseudomodul, mit dem Programmierer neue Sprachfunktionen aktivieren können, die nicht mit dem aktuellen Interpreter kompatibel sind . Beispielsweise wird der Ausdruck11/4
derzeit als ausgewertet2
. Wenn das Modul, in dem es ausgeführt wird, die wahre Division durch Ausführen aktiviert hat:from __future__ import division
der Ausdruck
11/4
würde zu bewerten2.75
. Durch Importieren des__future__
Moduls und Auswerten seiner Variablen können Sie sehen, wann ein neues Feature zum ersten Mal zur Sprache hinzugefügt wurde und wann es zum Standard wird:quelle
import __future__ xyz
ist dies ein No-Op?Es kann verwendet werden, um Funktionen zu verwenden, die in neueren Versionen mit einer älteren Version von Python angezeigt werden.
Zum Beispiel
ermöglicht es Ihnen,
print
als Funktion zu verwenden:quelle
Es gibt bereits einige gute Antworten, aber keine von ihnen enthält eine vollständige Liste dessen, was die
__future__
Aussage derzeit unterstützt.Einfach ausgedrückt, zwingt die
__future__
Anweisung Python-Interpreter, neuere Funktionen der Sprache zu verwenden.Folgende Funktionen werden derzeit unterstützt:
nested_scopes
Vor Python 2.1 löste der folgende Code einen NameError aus :
Die
from __future__ import nested_scopes
Direktive ermöglicht die Aktivierung dieser Funktion.generators
Eingeführte Generatorfunktionen wie die folgende, um den Status zwischen aufeinanderfolgenden Funktionsaufrufen zu speichern:
division
Die klassische Unterteilung wird in Python 2.x-Versionen verwendet. Dies bedeutet, dass einige Divisionsanweisungen eine vernünftige Annäherung an die Division ("wahre Division") und andere den Floor ("Floor Division") zurückgeben. Ab Python 3.0 wird die wahre Division durch angegeben
x/y
, während die Bodenteilung durch angegeben wirdx//y
.Die
from __future__ import division
Direktive erzwingt die Verwendung der Python 3.0-Stilteilung.absolute_import
Ermöglicht es Klammern, mehrere
import
Anweisungen einzuschließen . Zum Beispiel:Anstatt:
Oder:
with_statement
Fügt die Anweisung
with
als Schlüsselwort in Python hinzu, um die Notwendigkeit vontry/finally
Anweisungen zu beseitigen . Dies wird häufig bei Datei-E / A verwendet, z. B.:print_function
::Erzwingt die Verwendung des Funktionsaufrufs im Python 3-Klammerstil
print()
anstelle derprint MESSAGE
style-Anweisung.unicode_literals
Führt die Literal-Syntax für das
bytes
Objekt ein. Dies bedeutet, dass Aussagen wiebytes('Hello world', 'ascii')
einfach ausgedrückt werden können alsb'Hello world'
.generator_stop
Ersetzt die Verwendung der
StopIteration
in Generatorfunktionen verwendeten Ausnahme durch dieRuntimeError
Ausnahme.Eine andere Verwendung, die oben nicht erwähnt wurde, ist, dass die
__future__
Anweisung auch die Verwendung von Python 2.1+ -Interpretern erfordert, da die Verwendung einer älteren Version eine Laufzeitausnahme auslöst.Verweise
quelle
Oder ist es so, als würde man sagen: "Da dies Python v2.7 ist, verwenden Sie diese andere 'print'-Funktion, die auch zu python v2.7 hinzugefügt wurde, nachdem sie in Python 3 hinzugefügt wurde. Mein' print 'wird also keine Anweisung mehr sein (z. B. "Nachricht" drucken), aber Funktionen (z. B. Drucken ("Nachricht", Optionen)). Wenn mein Code in Python 3 ausgeführt wird, wird "Drucken" auf diese Weise nicht unterbrochen. "
Im
print_function ist das Modul, das die neue Implementierung von 'print' enthält, wie es sich in Python v3 verhält.
Dies hat weitere Erklärungen: http://python3porting.com/noconv.html
quelle
Eine der Anwendungen, die ich als sehr nützlich empfand, ist das
print_function
from-__future__
Modul.In Python 2.7 wollte ich, dass Zeichen aus verschiedenen Druckanweisungen in derselben Zeile ohne Leerzeichen gedruckt werden.
Dies kann durch ein Komma (",") am Ende erfolgen, es wird jedoch auch ein zusätzliches Leerzeichen angehängt. Die obige Aussage wird verwendet als:
Dadurch wird der Wert
v_num
jeder Iteration in einer einzelnen Zeile ohne Leerzeichen gedruckt .quelle
Nach Python 3.0 ist print nicht mehr nur eine Anweisung, sondern eine Funktion. und ist in PEP 3105 enthalten.
Ich denke auch, dass das Python 3.0-Paket immer noch diese speziellen Funktionen hat. Sehen wir uns die Benutzerfreundlichkeit anhand eines traditionellen "Pyramid-Programms" in Python an:
Wenn wir die normale Druckfunktion verwenden, können wir nicht dieselbe Ausgabe erzielen, da print () mit einem zusätzlichen Zeilenumbruch geliefert wird. Jedes Mal, wenn die innere for-Schleife ausgeführt wird, wird * in die nächste Zeile gedruckt.
quelle