2015-09-10 6 views
6

Ich versuche, ein vorwärts kompatibles Programm zu schreiben, und ich fragte mich, was die "beste" Möglichkeit, den Fall zu behandeln, wo Sie verschiedene Importe benötigen.Standardlösung für die Unterstützung von Python 2 und Python 3

In meinem speziellen Fall verwende ich ConfigParser.SafeConfigParser() von Python2, die configparser.ConfigParser() in Python3 wird.

Bisher habe ich es entweder mit einem try-except auf den Import oder durch eine bedingte auf die Version von Python (mit sys) funktioniert. Beide funktionieren, aber ich frage mich, ob es eine empfohlene Lösung gibt (vielleicht eine, die ich noch nicht ausprobiert habe).

ETA: Danke allen. Ich habe six.moves ohne Probleme verwendet.

+0

Es gibt alle möglichen Gründe außer der Python-Version, warum ein Import eine Ausnahme auslösen könnte! Die Konditionierung von sys.version_info muss also die bessere der beiden Ideen sein. – nigel222

+3

@ nigel222 Importe von der stdlib sollten keine Ausnahmen auslösen; wenn sie haben Sie viel größere Probleme. Die Versionskontrolle ist spröder und bringt nichts. – tzaman

+0

Es handelte sich nicht explizit nur um stdlib und nicht um bedingten Import im Allgemeinen. Auch "größere Probleme" sind häufiger, als Sie vielleicht denken, wenn das System ein Desktop ist, der von jemandem ohne IT-Hintergrund verwaltet wird (Bastler, Universitätsforscher, etc.) würde ich lieber direkt von ihnen wissen, anstatt ein Debuggen zu müssen falscher Import, der früher "funktioniert" hat! – nigel222

Antwort

6

Dieses Muster ist ziemlich Standard:

try: 
    from configparser import ConfigParser 
except ImportError: 
    from ConfigParser import SafeConfigParser as ConfigParser 
+0

Ich würde wahrscheinlich kommentieren, dass man für Python 2 und die anderen 3+ ist, aber ja! –

+2

Ein wilder Downvote erscheint! Ich wundere mich warum. –

+0

Wenn Sie keine zusätzlichen Module installieren möchten, ist dies die richtige Lösung. –

8

Verwenden six! Es ist ein Python-Kompatibilitätsmodul, das die Unterschiede zwischen python3 und python2 ausgleicht. Die Dokumentation available here werden Sie mit diesem Problem helfen sowie alle anderen Fragen die Sie haben ..

Speziell für Ihren Fall können Sie einfach

from six.moves import configparser 
import six 

if six.PY2: 
    ConfigParser = configparser.SafeConfigParser 
else: 
    ConfigParser = configparser.ConfigParser 

und Sie werden gut zu gehen.

+0

Das sieht ... schön aus, aber warum wird die Zuweisung zu 'ConfigParser' nicht von der' import' Anweisung behandelt? Ich hätte erwartet, dass dies der Punkt des Moduls "six.moves" ist. –

+0

... Oh, ich sehe, dass die 'import' Anweisung * die' ConfigParser => configparser' Modulname Änderung behandelt. Ich habs. –

+0

Dies ist die Lösung, die ich verwendet habe, und ja, sechs behandelt die Aufgabe. –

0

Sie können dies auch tun:

import sys 
if sys.version[:1] == '2': 
    from configparser import ConfigParser 
else: 
    from ConfigParser import SafeConfigParser as ConfigParser 

Lesen Sie mehr Here.

+0

Wie ich in meiner Frage gesagt habe, hatte ich bereits * wie * das getan, aber ich suchte nach der Best-Practice-Lösung und nach dem, was ich gelernt habe, ist dies die letzte Wahl. –