2015-09-10 20 views
6

Sto provando a scrivere un programma compatibile avanzato e mi chiedevo quale fosse il modo "migliore" per gestire il caso in cui sono necessarie importazioni diverse.Soluzione standard per supportare Python 2 e Python 3

Nel mio caso specifico, sto usando ConfigParser.SafeConfigParser() da Python2 che diventa configparser.ConfigParser() in Python3.

Finora l'ho fatto funzionare utilizzando una prova, tranne per l'importazione o utilizzando un condizionale per la versione di Python (utilizzando sys). Entrambi funzionano, ma mi chiedevo se ci fosse una soluzione raccomandata (forse una che non ho ancora provato).

ETA: Grazie a tutti. Ho usato six.moves senza problemi.

+0

Ci sono tutti i tipi di motivi a parte la versione python perché un'importazione potrebbe generare un'eccezione! Quindi condizionare su sys.version_info deve essere il migliore delle due idee. – nigel222

+3

@ nigel222 le importazioni dallo stdlib non dovrebbero generare eccezioni; se loro hanno problemi molto più grandi. Il controllo della versione è più fragile e non ti dà niente. – tzaman

+0

Non era esplicitamente interessato solo con stdlib piuttosto che con l'importazione condizionale in generale. Anche i "più grandi problemi" sono più comuni di quanto si possa pensare, se il sistema è un desktop gestito da qualcuno senza background IT (hobbista, ricercatore universitario, ecc.) Preferirei conoscerli direttamente piuttosto che dover eseguire il debug di un importazione errata che "funzionava"! – nigel222

risposta

6

Questo modello è abbastanza standard:

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

Probabilmente commento questo notando che uno è per Python 2 e gli altri 3+, ma sì! –

+2

Appare un downvote selvaggio! Mi chiedo perché. –

+0

Se non si desidera installare moduli aggiuntivi, questa è la soluzione corretta. –

8

Usa six! È un modulo di compatibilità python che elimina le differenze tra python3 e python2. La documentazione available here vi aiuterà con questo problema, così come tutte le altre questioni che stai avendo ..

In particolare per il vostro caso si può solo

from six.moves import configparser 
import six 

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

e sarete pronti per partire.

+0

Sembra ... bello, ma perché non è l'assegnazione a 'ConfigParser' gestita dall'istruzione' import'? Mi sarei aspettato che fosse il punto del modulo 'six.moves'. –

+0

... oh, vedo che l'istruzione 'import' * sta * gestendo la modifica del nome-modulo' ConfigParser => configparser'. Fatto. –

+0

Questa è la soluzione che ho usato e, sì, sei sta gestendo il compito. –

0

Si può anche fare questo:

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

Leggi tutto Here.

+0

Come affermato nella mia domanda, avevo già trovato * come * per farlo, ma stavo cercando la soluzione migliore e da quello che ho imparato questa è l'ultima scelta. –