2015-09-10 2 views
6

Я пытаюсь написать программу, совместимую с переходом, и мне было интересно, что «лучший» способ справиться с ситуацией, когда вам нужны разные импорт.Стандартное решение для поддержки Python 2 и Python 3

В моем конкретном случае я использую ConfigParser.SafeConfigParser() из Python2, который становится configparser.ConfigParser() в Python3.

До сих пор я работал над этим, используя попытку, кроме импорта, или используя условное выражение для версии Python (используя sys). Обе работы, но мне было интересно, было ли рекомендованное решение (возможно, я еще не пробовал).

ETA: Спасибо всем. Я использовал six.moves без проблем.

+0

Существует множество причин, кроме версии python, почему импорт может вызвать исключение! Таким образом, условие для sys.version_info должно быть лучше двух идей. – nigel222

+3

@ nigel222 импорт из stdlib не должен генерировать исключения; если они у вас есть гораздо большие проблемы. Проверка версий более хрупкая и не дает вам ничего. – tzaman

+0

Это явно не касалось только stdlib, а не условного импорта в целом. Кроме того, «Большие проблемы» более распространены, чем вы думаете, если система представляет собой настольный компьютер, поддерживаемый кем-то, у которого нет ИТ-фона (любитель, университетский исследователь и т. Д.), Я бы предпочел узнать о них напрямую, а не отлаживать неправильный импорт, который «привык к работе»! – nigel222

ответ

6

Эта модель является довольно стандартным:

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

Я бы, наверное, прокомментировал это, отметив, что это для Python 2 и других 3+, но да! –

+2

Появляется дикий понижатель! Интересно, почему. –

+0

Если вы не хотите устанавливать дополнительные модули, это правильное решение. –

8

Использование six! Это модуль совместимости python, который убирает различия между python3 и python2. Документация available here поможет вам с этой проблемой, а также любые другие вопросы, вы испытываете ..

специально для Вашего случая вы можете просто

from six.moves import configparser 
import six 

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

и вы будете хорошо идти.

+0

Это выглядит ... приятно, но почему не задание 'ConfigParser' обрабатывается оператором' import'? Я бы ожидал, что это будет точка модуля 'six.moves'. –

+0

... о, я вижу, что оператор 'import' * обрабатывает изменение имени модуля ConfigParser => configparser'. Понял. –

+0

Это решение, которое я использовал, и да, шесть обрабатывает задание. –

0

Вы также можете сделать это:

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

Подробнее Here.

+0

Как было сказано в моем вопросе, я уже нашел *, как это сделать, но я искал решение по лучшим методам и из того, что я узнал, это последний выбор. –

Смежные вопросы