Я устал от проблемы с pylint, которая не может импортировать файлы, когда вы используете пакеты пространств имен и разделяете код на отдельные папки. Поэтому я начал копаться в исходном коде astNG, который был идентифицирован как источник проблемы (см. Отчет об ошибке 8796 на astng). В основе проблемы, похоже, лежит использование собственного imp.find_module
питонов в процессе поиска импорта.
Происходит то, что первый (под) пакет импорта - a
в import abc
- передается в find_module
с путем None
. Какой бы путь ни вернулся, он затем передается в find_module
на следующем проходе в цикле поиска, где вы пытаетесь найти b
в предыдущем примере.
Псевдокод из logilab.common.modutils:
path = None
while import_as_list:
try:
_, found_path, etc = find_module(import_as_list[0], path)
#exception handling and checking for a better version in the .egg files
path = [found_path]
import_as_list.pop(0)
Вот что сломано: вы получаете только первый лучший результат от find_module
, который может иметь или не иметь ваши подпакеты в этом. Если вы НЕ найдете подпакеты, у вас нет возможности вернуться назад и попробовать следующий.
Я пробовал явно использовать sys. path вместо None, чтобы результат можно было удалить из списка путей и сделать вторую попытку, но средство поиска модулей python достаточно умен, что не обязательно должно быть точное совпадение путей, что делает этот подход непригодным для использования - в любом случае насколько мне известно.
Есть ли альтернатива find_modules, которая вернет ВСЕ возможные совпадения или возьмет список исключений? Я также открыт для совершенно разных решений. Желательно не исправлять python вручную, но это было бы невозможно - по крайней мере, для локального решения.
(Caveat emptor: я использую python 2.6 и по причинам текущей политики компании не могу обновить, предложения по p3k и т. д. не будут помечены как принятые, если это не единственный ответ.)