2015-02-06 2 views
2

Я пытаюсь собрать систему, которая будет обрабатывать ленивую загрузку модулей, которые явно не существуют. В основном у меня есть http-сервер с множеством конечных точек, которые я не знаю заранее, что я хотел бы программно предложить для импорта. Эти модули будут иметь единую сигнатуру метода, они просто не будут существовать раньше времени.Lazy-load modules in python

import lazy.route as test 
import lazy.fake as test2 

test('Does this exist?') # This sends a post request. 
test2("This doesn't exist.") # Also sends a post request 

Я могу справиться всю логику мне нужно вокруг этого импорта с однородным декоратором, я просто не могу найти способ «украшение» импорта в питоне, или на самом деле, взаимодействуя с ними в каком-либо программном пути ,

У кого-нибудь есть опыт? Я охотился вокруг, и самое близкое, что я нашел, это модуль ast, который привел бы к действительно ужасной хакерской реализации в моем текущем под моим текущим пониманием (что-то вроде поиска всех операторов импорта и ручного перезаписи функция импорта)

Не ищите раздаточный материал, просто часть кода на основе python, чтобы начать смотреть, или пример того, кто сделал что-то подобное.

+0

Вы ищете [ 'importlib'] (https://docs.python.org/3/library/importlib.html)? – jonrsharpe

+0

@jonrsharpe нет, вид обратного. Я не пытаюсь использовать импорт в другом месте, я пытаюсь перезаписать существующую операцию импорта python. –

+0

. К закрытию голосования: не запрашивать библиотеку, в основном, возможна ли эта функция в пределах python, так как ее нет. документацию, которую я могу найти. –

ответ

7

У меня было немного умного в моем поиске в Интернете и удалось найти PEP, специально предназначенный для этой проблемы, но это просто неизвестно, вероятно, потому, что подмножество разумных применений для этого довольно узкое.

Я нашел отличный пример кода примера, демонстрирующий новую реализацию sys.meta_path. Я разместил его ниже для получения информации о том, как динамически загружать ваши инструкции импорта.

import sys 


class VirtualModule(object): 

    def hello(self): 
     return 'Hello World!' 


class CustomImporter(object): 

    virtual_name = 'my_virtual_module' 

    def find_module(self, fullname, path): 
     """This method is called by Python if this class 
     is on sys.path. fullname is the fully-qualified 
     name of the module to look for, and path is either 
     __path__ (for submodules and subpackages) or None (for 
     a top-level module/package). 

     Note that this method will be called every time an import 
     statement is detected (or __import__ is called), before 
     Python's built-in package/module-finding code kicks in.""" 

     if fullname == self.virtual_name: 

     # As per PEP #302 (which implemented the sys.meta_path protocol), 
     # if fullname is the name of a module/package that we want to 
     # report as found, then we need to return a loader object. 
     # In this simple example, that will just be self. 

     return self 

     # If we don't provide the requested module, return None, as per 
     # PEP #302. 

     return None 

    def load_module(self, fullname): 
     """This method is called by Python if CustomImporter.find_module 
     does not return None. fullname is the fully-qualified name 
     of the module/package that was requested.""" 

     if fullname != self.virtual_name: 
     # Raise ImportError as per PEP #302 if the requested module/package 
     # couldn't be loaded. This should never be reached in this 
     # simple example, but it's included here for completeness. :) 
     raise ImportError(fullname) 

     # PEP#302 says to return the module if the loader object (i.e, 
     # this class) successfully loaded the module. 
     # Note that a regular class works just fine as a module. 
     return VirtualModule() 


if __name__ == '__main__': 

    # Add our import hook to sys.meta_path 
    sys.meta_path.append(CustomImporter()) 

    # Let's use our import hook 
    import my_virtual_module 
    print my_virtual_module.hello() 

Полный блог пост here