2014-10-18 8 views
5

Ich möchte offiziell Python 2-Unterstützung für ein Programm, das ich verwalte, fallen lassen und die Vorteile von Python 3-Funktionen voll ausnutzen. Anstatt ein Programm zu haben, das mehr oder weniger unter Python 2 funktioniert, aber in Eckenfällen mit merkwürdigem Verhalten versagt, möchte ich offiziell mein Programm für Python 2 mit einer klaren Fehlermeldung "Bitte benutze Python 3 statt" brechen. Was ist der vernünftigste Weg, Fehler mit nicht unterstützten Python-Versionen zu beheben?Gibt es eine Standardmethode, um alte Python-Versionen zu deklarieren?

Zum Beispiel möchte ich den Code in Python 2 importieren (mindestens das Paket der obersten Ebene), um einen Fehler auszulösen, und für mein Skript distutils setup.py beim Versuch, es für Python zu installieren oder zu erstellen 2 (auch wenn über Python 3 wie python3 setup.py sdist_dsc --with-python2 aufgerufen). Ich möchte auch alle relevanten Metadaten einschließen, um offiziell zu deklarieren, welche Python-Versionen ich unterstütze. Es gibt ein Requires-Python-Feld in PEP 345, aber das ist nicht wichtig, wenn ich distutils2 nicht verwende.

+0

ich auch gut schlagend würde eine Art von 3to2-Übersetzung für Best-Effort Python 2 Abwärtskompatibilität, aber IIUC, das ist ein manueller Prozess und bietet keine Art von müheloser on-the-fly-Übersetzung. –

Antwort

5

Import zu vermeiden, setzen Sie diese an der Oberseite des Moduls:

import sys 

if sys.version_info[0] < 3: 
    raise ImportError('Python < 3 is unsupported.') 

Installation Um zu verhindern, das von setup.py an der Spitze setzen:

import sys 

if sys.version_info[0] < 3: 
    sys.exit('Python < 3 is unsupported.') 

Dies wird auch vor der Prüfung scheitern Wenn Sie eine Syntax verwenden, die mit Python 2 nicht kompatibel ist, wird das Modul vor dem Ausführen analysiert. Das zu erkennen, könnte Overkill für die Unterstützung sein, "Python 2 nicht zu unterstützen".

Aber ich habe das tatsächlich nicht in der Praxis gesehen. Die meisten Betreuer sagen nur, was unterstützt wird und überprüfen nicht.

+0

'sys.exit' wäre nur für' setup.py' und das Beispiel, das eine Ausnahme auslöst, die Sie ursprünglich hatten, wäre für den Import. Könnten Sie die verschiedenen Szenarien in Ihrer Antwort verdeutlichen? Im Moment sagt es nur "setze das Folgende an die Spitze". –

+0

@MuMind: Wenn ein Modul sowohl importiert als auch als Skript ausgeführt werden kann, wird 'if __name__ ==" __main __ "' dann als Skript ausgeführt. – jfs

3

Der üblicher Weg ist die classifiers in setup.py einzustellen:

if sys.version_info < (3, 3): 
    sys.exit("error: this script requires Python 3.3 or greater.") 

setup(..., 
classifiers=[ 
     'Programming Language :: Python :: 3', 
     'Programming Language :: Python :: 3.3', 
     'Programming Language :: Python :: 3.4', 
     # ... other non-version info 
    ], 
    ...) 

Zum Beispiel tulip project (asyncio) supports only Python 3.3.

Sie können auch in Ihrem Paket hinzufügen __init__.py:

if sys.version_info < (3, 3): 
    raise ImportError("Python 3.3 or greater is required") 
2

Ich würde mit @davidsm Antwort gehen, sondern würde ich hebe nur eine Ausnahme:

import sys 

if sys.version_info[0] < 3: 
    raise ImportError('Only Python 3 is supported.') 
+0

Wahrscheinlich sollte nur ein Kommentar zu dieser Antwort sein, aber ich stimme dem Vorschlag zu. =) –

+0

Warum die Protokollierung importieren? –

Verwandte Themen