Wie gehen Sie mit fehlgeschlagenen zukünftigen Feature-Importen um? Wenn ein Benutzer mit Python 2.5 ausgeführt wird und die erste Anweisung in meinem Modul lautet:
from __future__ import print_function
Das Kompilieren dieses Moduls für Python 2.5 schlägt fehl mit:
File "__init__.py", line 1
from __future__ import print_function
SyntaxError: future feature print_function is not defined
Ich möchte den Benutzer darüber informieren, dass er das Programm mit Python> = 2.6 erneut ausführen muss, und möglicherweise einige Anweisungen dazu geben. Um jedoch PEP 236 zu zitieren :
Die einzigen Zeilen, die vor einer future_statement erscheinen können, sind:
- Das Modul docstring (falls vorhanden).
- Bemerkungen.
- Leerzeilen.
- Andere future_statements.
Also kann ich so etwas nicht machen:
import __future__
if hasattr(__future__, 'print_function'):
from __future__ import print_function
else:
raise ImportError('Python >= 2.6 is required')
Weil es ergibt:
File "__init__.py", line 4
from __future__ import print_function
SyntaxError: from __future__ imports must occur at the beginning of the file
Dieser Ausschnitt aus dem PEP scheint Hoffnung zu geben, es inline zu tun:
F: Ich möchte future_statements in try / exception-Blöcke einschließen, damit ich je nach der von mir ausgeführten Python-Version unterschiedlichen Code verwenden kann. Warum kann ich nicht?
Tut mir leid! try / Except ist eine Laufzeitfunktion. future_statements sind in erster Linie Gimmicks zur Kompilierungszeit, und Ihr Versuch / Ihre Ausnahme erfolgt lange nach Abschluss des Compilers. Das heißt, zu dem Zeitpunkt, an dem Sie versuchen / ausnehmen, ist die für das Modul geltende Semantik bereits abgeschlossen. Da der Versuch / außer nicht das erreichen würde, wie es aussehen sollte, ist es einfach nicht erlaubt. Wir möchten auch, dass diese besonderen Aussagen sehr leicht zu finden und zu erkennen sind.
Beachten Sie, dass Sie können direkt importieren __future__, und verwenden Sie die Informationen in sie, zusammen mit sys.version_info, um herauszufinden , wo die Freisetzung Sie unter steht in Bezug auf eine bestimmte Funktion Status ausführen.
Ideen?
#ifdefGimmick zur Kompilierungszeit ein, damit ich all diese__future__Dinge in einem einzigen anmutig behandeln kann Datei? AAAARRGGGHHH .....