пользовательский find_module всегда вызывается с ‘полным именем’, равным None

#python #import

#python #импорт

Вопрос:

Я пытаюсь реализовать пользовательские find_module и load_module методы. Кажется, что он вызывается, но find_module всегда вызывается как с полным именем, так и с путем, всегда установленным в None . Я не понимаю, почему.

Вот заглушка программы:

 class TouchImportLoader:
    def load_module(self, fullname):
        return None

class TouchImportFinder:
    def find_module(self, fullname, path=None):
        #fullname and path seem to be None always, when printed here
        return TouchImportLoader()

sys.meta_path.append(TouchImportFinder)
  

Я вызываю его с помощью простых скриптов, таких как:

 import time
print(time.clock())
  

Ответ №1:

Пожалуйста, прочитайте документацию:

find_module() Метод вызывается по крайней мере с абсолютным именем импортируемого модуля. Если импортируемый модуль содержится в пакете, то __path__ атрибут родительского пакета передается в качестве второго аргумента.

path Аргумент передается только для пакетов.

В вашем примере вы должны получить TypeError :

несвязанный метод find_module() должен вызываться с TouchImportFinder экземпляром в качестве первого аргумента (вместо этого есть str экземпляр)

…поскольку вы добавляете класс finder в meta_path , а не экземпляр класса:

 sys.meta_path.append(TouchImportFinder)
  

Это должно гласить:

 sys.meta_path.append(TouchImportFinder())
  

Комментарии:

1. Спасибо. Я внедряю Python в другое приложение и не смог перехватить какие-либо ошибки, возвращаемые на ранней стадии его инициализации. Это устраняет проблему.