专栏首页地方网络工作室的专栏python 动态获取类或者函数 pkgutil 动态引入模块

python 动态获取类或者函数 pkgutil 动态引入模块

根据字典键名查看键值不会报错的方法

一般情况下,我们会用类似 someDict['keyName'] 的方法,来获取键值内容。但是,如果这个键名不存在的话,就会报错。所以,在不确定的地方,推荐使用 get 方法来进行获取。就像 someDict.get('keyName') 这样。

实际运行效果如下:

如上图所示,这样取是不会报错的,只是没有返回而已。

根据字符串动态获取或执行类或函数

例如,我们在 model.py 这个文件中,有一个 class Test 的一个类。我们当然可以使用 from model import Test 这样的代码来进行引入。

但是问题是,如果你这个 Test 是通过程序动态计算出来的,你根本就不知道这个字符串具体是什么,改怎么办呢?

其实,解决方法非常简单,演示代码如下:

import model
classModel = getattr(model, 'Test')

这样,我们就拿到了这个 Test 的类了。并赋予了变量 classModel ,我们可以用这个变量去做应该做的事情了。

上面是演示了类根据字符串名称引入的方法。事实上,如果是 def 函数,也同样是可以用 getattr 函数引用。

因为这样的参数,让我们可以写出来非常灵活的代码。

pkgutil 动态引入模块

引入模块的方法非常简单,只要 import os 这样就可以引入了。但是,和上面一样,你会在一个文件夹中写越来越多的功能各异的业务代码,然后交给程序统一处理,这里,就需要动态引入了。

这里,我们使用 pkgutil 来实现这个功能,演示代码如下:

import pkgutil
# 引入存放未知模块的目录名称
import process
modules = {}
for _, name, __ pkgutil.iter_modules(process.__path__):
    m = _.find_module('process.' + name).load_module('process.' + name)
    modules[name] = m

然后,我们就可以用 modules[name] 来使用这个未知模块了。

其实 process.__path__ 就是一个文件夹路径的列表而已,并且,它还支持相对路径,所以上面的代码可以优化为如下代码:

import pkgutil

r = 'process'
modules = {}
for _, name, __ pkgutil.iter_modules([r]):
    m = _.find_module(r + '.' + name).load_module(r + '.' + name)
    modules[name] = m

好,连事先引入文件夹都省了。但上面的代码,是单层目录,如果是多层目录应该怎么办呢?那就这样写:

import pkgutil
r = 'process'
modules = {}
for x, n, _ in pkgutil.iter_modules([r]):
    m = x.find_module(r + '.' + n).load_module(r + '.' + n)
    for xx, nn, __ in pkgutil.iter_modules([r + '/' + n]):
        mm = xx.find_module(r + '.' + n + '.' + nn).\
                load_module(r + '.' + n + '.' + nn)
        for xxx, nnn, ___ in pkgutil.iter_modules([r + '/' + n + '/' + nn]):
            mmm = xxx.find_module(r + '.' + n + '.' + nn + '.' + nnn).\
                    load_module(r + '.' + n + '.' + nn + '.' + nnn)
            modules[n+nn+nnn] = mmm

我写的代码中,用到了一个三层的未知模块引入,所以,我写了上面这段代码。我表示呵呵~

每一个文件夹中,都必须包含 __init__ 文件,否则文件夹不会被自动识别为模块。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 好用的 Linux \ Mac 搜索命令 fd 命令用法

    版权声明:本文为 FengCms FungLeo 原创文章,允许转载,但转载必须注明出处并附带首发链接 ...

    FungLeo
  • React + webpack 开发单页面应用简明中文文档教程(十)在 jsx 和 scss 中使用图片

    版权声明:本文为 FengCms FungLeo 原创文章,允许转载,但转载必须注明出处并附带首发链接 ...

    FungLeo
  • 图片自适应父元素大小,并左右上下居中的css方法

    图片自适应父元素大小,并左右上下居中的css方法 前言 这种效果多见于矩形盒子里面调用不规则的图片,希望能够达到的效果。这个效果可以很简单的用css来实现,虽然...

    FungLeo
  • PKW: flask 接收请求参数 + pandas groupby 实用(第 2 期)

    ”有时候就是要经历一些糟糕的事情才能意识到世间存在的美丽。 Sometimes it takes going through something so awfu...

    周萝卜
  • JSP+Servlet项目整合

    m:model service层和dao层和实体类层 v:view 视图层jsp页面 c:controller 控制层servlet

    时间静止不是简史
  • 爬虫进阶:Scrapy入门

      学Py和写爬虫都有很长一段时间了,虽然工作方面主要还是做Java开发,但事实上用python写东西真的很爽。之前都是用Requests+BeautifulS...

    happyJared
  • Java魔法堂:打包知识点之jar

    一、前言                                    通过eclipse导出jar包十分方便快捷,但作为码农岂能满足GUI的便捷呢?所...

    ^_^肥仔John
  • Python 骚操作!如何让自己在斗图中立于不败之地?

    平常和小伙伴们斗图的过程中,你是否觉得微信的表情收藏夹不够用,或者是查找太麻烦,不够个性化?

    小小詹同学
  • Openstack中的虚拟机的cpu绑定

    重启nova服务,所有实例只能跑在CPUs 4,5,6,7,9,10,11,12,15上。

    后端云
  • 图形图像算法中必须要了解的设计模式(3)

    随着信息的多元化,信息的概念不仅仅指的是文字,它还包含图片、声音、视频等其它丰富的信息。文字信息越来越多地被图片、声音、视频信息所替代,而视频又是由一针一针的图...

    OpenCV学堂

扫码关注云+社区

领取腾讯云代金券