Задний план
Я устал от проблемы с тем, что 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, которая возвращает ВСЕ возможные совпадения или принимает список исключений? Я также открыт для совершенно разных решений. Желательно не исправлять python вручную, но это не невозможно — по крайней мере, для локального решения.
(Предостережение: я использую python 2.6 и по причинам текущей политики компании не могу обновиться, предложения для p3k и т. Д. Не будут помечены как принятые, если это не единственный ответ.)