2015-09-10 9 views
6

Próbuję napisać zgodny program do przodu i zastanawiałem się, jaki "najlepszy" sposób postępowania z przypadkiem, w którym potrzebny jest inny import.Standardowe rozwiązanie do obsługi Pythona 2 i Pythona 3

W moim konkretnym przypadku używam ConfigParser.SafeConfigParser() z Python2, który staje się configparser.ConfigParser() w Python3.

Do tej pory zrobiłem to działając albo za pomocą try-oprócz importu lub używając warunku na wersji Pythona (używając sys). Oba działają, ale zastanawiałem się, czy istnieje zalecane rozwiązanie (może jeszcze nie próbowałem).

ETA: Dziękuję wszystkim. Użyłem six.moves bez problemów.

+0

Istnieje wiele różnych powodów poza wersją python, dlaczego import może rzucić wyjątek! Więc warunek sys.version_info musi być lepszy z dwóch pomysłów. – nigel222

+3

@ nigel222 import ze stdlib nie powinien generować wyjątków; jeśli tak, masz znacznie większe problemy. Sprawdzanie wersji jest bardziej kruche i nic Ci nie daje. – tzaman

+0

Nie dotyczyło to wyraźnie tylko stdlib, a nie ogólne importowanie warunkowe. Również "Większe problemy" są bardziej powszechne, niż mogłoby się wydawać, jeśli system jest komputerem stacjonarnym obsługiwanym przez kogoś, kto nie ma wykształcenia informatycznego (hobbista, badacz uniwersytecki itp.). Wolałbym wiedzieć o nich bezpośrednio, zamiast debugować niewłaściwy import, który "działał"! – nigel222

Odpowiedz

6

Ten wzór jest dość standardowy:

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

Najprawdopodobniej skomentowałbym to stwierdzenie dla Pythona 2 i innych 3+, ale tak! –

+2

Pojawia się dzikie zagłosowanie! Zastanawiam się dlaczego. –

+0

Jeśli nie chcesz instalować dodatkowych modułów, to jest to właściwe rozwiązanie. –

8

Zastosowanie six! Jest to moduł zgodności python, który usuwa różnice między python3 i python2. Dokumentacja available here pomoże z tym problemem, jak również wszelkie inne kwestie masz ..

specjalnie dla przypadku można po prostu

from six.moves import configparser 
import six 

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

i będziesz dobrze iść.

+0

Wygląda to ... ładnie, ale dlaczego przypisanie do 'ConfigParser' nie jest obsługiwane przez instrukcję' import'? Spodziewałbym się, że będzie to punkt modułu "six.moves". –

+0

... oh, widzę, że instrukcja 'import' * * obsługuje zmianę nazwy modułu' ConfigParser => configparser'. Rozumiem. –

+0

To jest rozwiązanie, którego użyłem i tak, sześć zajmuje się zadaniem. –

0

Można też to zrobić:

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

Czytaj więcej Here.

+0

Jak stwierdzono w moim pytaniu, już znalazłem * jak * to zrobić, ale szukałem najlepszego rozwiązania i z tego, czego się dowiedziałem, jest to ostatni wybór. –

Powiązane problemy