Альтернативы imp.find_module?

Предпосылках

Я устал от проблемы с 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 достаточно умен, что не обязательно должно быть точное совпадение путей, что делает этот подход непригодным для использования - в любом случае насколько мне известно.

Teary-eyed Plea

Есть ли альтернатива find_modules, которая вернет ВСЕ возможные совпадения или возьмет список исключений? Я также открыт для совершенно разных решений. Желательно не исправлять python вручную, но это было бы невозможно - по крайней мере, для локального решения.

(Caveat emptor: я использую python 2.6 и по причинам текущей политики компании не могу обновить, предложения по p3k и т. д. не будут помечены как принятые, если это не единственный ответ.)

5
задан Per Fagrell 21 April 2011 в 14:00
поделиться