加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

在python中加载延迟模块

发布时间:2020-12-20 11:40:29 所属栏目:Python 来源:网络整理
导读:我正在尝试组建一个系统来处理延迟加载未明确存在的模块.基本上我有一个http服务器,其中包含许多我不知道的端点,我想以编程方式提供导入.这些模块都有统一的方法签名,它们不会提前存在. import lazy.route as testimport lazy.fake as test2test('Does this
我正在尝试组建一个系统来处理延迟加载未明确存在的模块.基本上我有一个http服务器,其中包含许多我不知道的端点,我想以编程方式提供导入.这些模块都有统一的方法签名,它们不会提前存在.

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

我可以使用统一的装饰器处理这些导入所需的所有逻辑,我在python中找不到任何“装饰”导入的方法,或者实际上以任何编程方式与它们进行交互.

有任何人对此有经验吗?我一直在寻找,最接近我发现的是ast模块,在我目前的理解下,这将导致我目前的一种非常糟糕的hacky实现(比如查找所有import语句和手动覆盖导入功能)

不是寻找讲义,只是开始查看的一段python代码库,或者是一个类似的东西的例子.

解决方法

我在google搜索中有点聪明,设法找到一个专门解决这个问题的PEP,它恰好相对未知,可能是因为合理用途的子集非常狭窄.

我找到了一个很好的示例代码,展示了新的sys.meta_path实现.我已经在下面发布了它,以获取有关如何动态引导import语句的信息.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读