При переносе python 2.5 на 3.X, как я могу заменить ‹module› import *?

У меня есть пакет python 2.5 со следующей структурой:

введите здесь описание изображения

Config.py содержит следующую строку:

from CommonDefines import *

Выполнение этого кода в версии 3.7 приводит к следующему исключению:

Файл "../../.\ConfigLib\Config.py", строка 7, из импорта CommonDefines * ModuleNotFoundError: Нет модуля с именем "CommonDefines"

Заменив эту строку на:

from .CommonDefines import *

... работает в 3.7, но выдает следующую ошибку в 2.5:

SyntaxError: «импорт *» не разрешен с «из».

Есть ли способ написать эту строку так, чтобы она работала как в 2.5, так и в 3.X?

ИЗМЕНИТЬ:

Следующее не работает, так как второй импорт вызывает синтаксическую ошибку в 2.5

try:
    from CommonDefines import *
except:
    from .CommonDefines import *

SyntaxError: «импорт *» не разрешен с «из».


person Anton Lahti    schedule 20.02.2020    source источник
comment
Написание многоязычного кода, поддерживающего такую ​​старую версию Python (последний выпуск 2.5.x был выпущен в мае 2011 г. — python.org/downloads/release/python-256) будет очень сложно (six поддерживает только 2.7, например). Если вам действительно нужно продолжать поддерживать 2.5, возможно, вы не сможете поддерживать 3.x с той же кодовой базой.   -  person jonrsharpe    schedule 20.02.2020
comment
Спасибо, но это не совсем ответ на вопрос.   -  person Anton Lahti    schedule 20.02.2020
comment
Вы должны иметь возможность писать разные импорты, заключенные в блоки try except. Но, как пишет @jonrsharpe, я бы не рекомендовал использовать одну и ту же кодовую базу для обеих версий, потому что между ними произошло много изменений.   -  person Hampus Larsson    schedule 20.02.2020
comment
Вот почему я не опубликовал это как ответ! @HampusLarsson обратите внимание, что в OP есть синтаксическая ошибка, которую сложнее исправить с помощью try:/except:.   -  person jonrsharpe    schedule 20.02.2020
comment
Правильный. Я добавил правку, касающуюся этого.   -  person Anton Lahti    schedule 20.02.2020
comment
ИМХО * импорт в любом случае является анти-шаблоном, поэтому на вашем месте я бы просто заменил * на конкретные импортированные имена.   -  person AKX    schedule 20.02.2020


Ответы (1)


Я бы просто использовал правильный импорт имени за именем, но это можно сделать хакерским способом, для вашего личного использования, используя exec:

try:
    from CommonDefines import *
except ModuleNotFoundError:
    exec('from .CommonDefines import *')

Вы даже можете поменять их местами и поймать SyntaxError.

person kabanus    schedule 20.02.2020
comment
Это то, что я закончил делать, и это, кажется, работает до сих пор. - person Anton Lahti; 20.02.2020