Wie kann mit fehlgeschlagenen zukünftigen Feature (__future__) -Importen aufgrund der alten Interpreter-Version ordnungsgemäß umgegangen werden?

Wie gehen Sie ordnungsgemäß mit fehlgeschlagenen zukünftigen Feature-Importen um? Wenn ein Benutzer Python 2.5 verwendet 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 Anweisungen dazu geben. Um jedoch @ zu zitierPEP 236:

Die einzigen Zeilen, die vor einer future_statement erscheinen können, sind:

Der Modul-Docstring (falls vorhanden).BemerkungenBlank lines. Andere zukünftige_Anweisungen.

So kann ich sowas 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, dies inline zu tun:

Q: Ich möchte future_statements in try / except-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 try / except passiert lange nachdem der Compiler fertig ist. Das heißt, bis Sie / except ausprobieren, ist die für das Modul geltende Semantik bereits erledigt. Da würde das try / except nicht leisten was essieht au wie es sollte, ist es einfach nicht erlaubt. Wir möchten auch, dass diese besonderen Aussagen leicht zu finden und wiederzuerkennen sind.

Bitte beachten Sie, dass Siekönne importieren Sie __future__ direkt und verwenden Sie die darin enthaltenen Informationen zusammen mit sys.version_info, um herauszufinden, wo die Version, unter der Sie arbeiten, in Bezug auf den Status eines bestimmten Features steht.

Ideen?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage