Фон
Я устал от проблемы с pylint, которая не позволяет импортировать файлы, когда вы используете пакеты пространства имен и делите базу кода на отдельные папки.Поэтому я начал копаться в исходном коде astNG, который был определен как источник проблемы (см. Отчет об ошибке 8796 на astng).В основе проблемы, по-видимому, лежит использование собственных питонов imp.find_module
в процессе поиска импорта.
В результате получается, что первый (суб) пакет импорта - a
в import a.b.c
-подается на 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, которая выдаст ALL возможных совпадений или взять список исключений?Я также открыт для совершенно разных решений.Желательно не вносить исправления в python вручную, но это было бы невозможно - по крайней мере, для локального решения.
(Caveat emptor: я работаю с python 2.6 и по причинам текущей политики компании не могу выполнить обновление,предложения для p3k и т. д. не будут помечены как принятые, если это не единственный ответ.)