前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python30 动态导入模块/断言

Python30 动态导入模块/断言

作者头像
py3study
发布2020-01-08 17:37:07
7130
发布2020-01-08 17:37:07
举报
文章被收录于专栏:python3

动态导入模块

方式1(解释器调用)

image_1c57etc0116atrcq196brr013o31p.png-5.7kB
image_1c57etc0116atrcq196brr013o31p.png-5.7kB

根据当前目录结构进行动态导入模块设置

代码语言:javascript
复制
#在A1.py中

from code1 import aa  #使用该方式就可以导入aa这个模块
代码语言:javascript
复制
#在A1.py中

modname = 'aa'
from code1 import modname
#如果通过导入字符串的方式,来导入模块就会报错,因为modname = 'aa',只是一个字符串形式,不是一个模块
代码语言:javascript
复制
#在A1.py中

mod1 = __import__('code1')  #当前只导入了code1这个路径
mod2 = __import__('code1.aa')   #这里虽然写的是'code1.aa',但是导入的也只是code1这个路径
print (mod1)
print (mod2)

执行结果:
<module 'code1' from 'E:\\python\\代码练习\\code1\\__init__.py'>
<module 'code1' from 'E:\\python\\代码练习\\code1\\__init__.py'>
#当前结果我们看到的虽然一样,但实际是有区别的;

mod1 = __import__('code1')  #当前只导入了code1这个路径
mod2 = __import__('code1.aa')   #这里虽然写的是'code1.aa',但是导入的只是code1这个路径
print (mod1.aa)
print (mod2.aa)

执行结果:
<module 'code1.aa' from 'E:\\python\\代码练习\\code1\\aa.py'>
<module 'code1.aa' from 'E:\\python\\代码练习\\code1\\aa.py'>
#在这里可能认为我们定义变量的时候(mod2 = __import__('code1.aa')),是否加后面的'.aa'都是可以的,但请看下面的代码

#将mod2注释掉
mod1 = __import__('code1')
print (mod1.aa)

执行结果:
Traceback (most recent call last):
  File "E:/python/代码练习/A1.py", line 4, in <module>
    print (mod1.aa)
AttributeError: module 'code1' has no attribute 'aa'
#可以看到单独的mod1是没有定义后面的'.aa',所以这里无法调用mod1.aa;  上面的代码能调用那是因为mod2中已经定义了'.aa',所以mod1才可以调用的。

#将mod1注释掉
mod2 = __import__('code1.aa') 

print (mod2)
print (mod2.aa)

执行结果:
<module 'code1' from 'E:\\python\\代码练习\\code1\\__init__.py'>
<module 'code1.aa' from 'E:\\python\\代码练习\\code1\\aa.py'>
#执行结果说明了当定义了,假如只定义了2层路径时,第1层和第2层路径都是可以访问的,但是如果只定义了1层路径时,第2层路径是不能访问的(因为根本就不知道第2层路径的内容)。
代码语言:javascript
复制
#在aa.py中
class C:
    def __init__(self):
        self.name = 'zhangsan'

#在A1.py中        
mod1 = __import__('code1.aa')   
#这里虽然都是字符串格式,但却是可以通过__import__方式动态导入的

obj = mod1.aa.C()   #对aa.py中的class C生成一个实例
print (obj.name)

执行结果:
zhangsan

方式2

官方建议使用方式2来动态导入模块

代码语言:javascript
复制
import importlib #内置模块

aa = importlib.import_module('code1.aa')

print (aa.C().name)

断言

断言可以判断是否为真

代码语言:javascript
复制
obj = 'zhangsan'
assert type(obj) is str
#通过type(obj)来判断obj是一个字符串;为真的话,就继续向下执行代码。
print ('testtest')

执行结果:
testtest
代码语言:javascript
复制
obj = 'zhangsan'
assert type(obj) is int #断言obj为整数
print ('testtest')

执行结果:
Traceback (most recent call last):
  File "E:/python/代码练习/A2.py", line 4, in <module>
    assert type(obj) is int
AssertionError
#断言错误,就不会向下执行代码

当后面的代码完全依赖前面的条件时,就可以使用断言; 比如判断一个变量为整数后,才对这个变量(整数)进行加减乘除的计算,否则就报错。 或者判断银行转账之前,得确认余额足够,然后才会去执行转账动作。

断言与if类似,不过断言会进行报错来提示。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/09/12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 动态导入模块
    • 方式1(解释器调用)
      • 方式2
      • 断言
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档