from pil import image找不到指定模块_有节制地使用from...import语句

Python导入包的机制辨析~

7f89c34c768718ab9290f46c4a93334e.png

在Python中有3种方法可以引入外部模块:

  • import语句
  • from ... import ...语句
  • __import__函数

使用import的注意事项

  • 优先使用import xxx的形式
  • 有节制地使用from xxx import yyy的形式
  • 避免使用from xxx import *的形式

为什么要这样来建议,我们可以从Python如何导入模块来分析。

Python导入模块的机制

在初始化运行环境的时候Python解释器会自动加载一些内建模块,可以通过sys.modules.items()函数查看预加载模块的信息。

当用户加载模块时会发生以下过程:

  • 1)在sys.modules中进行搜索看看该模块是否已经存在,如果存在,则将其导入到当前局部命名空间,加载结束。
  • 2)如果在sys.modules中找不到对应模块的名称,则为需要导入的模块创建一个字典对象,并将该对象信息插入sys.modules中。
  • 3)加载前确认是否需要对模块对应的文件进行编译,如果需要则先进行编译。
  • 4)执行动态加载,在当前模块的命名空间中执行编译后的字节码,并将其中所有的对象放入模块对应的字典中。

无节制使用from ... import带来的问题

(1) 命名空间冲突

由于from ... import会将导入的名字引入当前命名空间,在项目中,特别是大型项目中频繁地使用from a import ...会增加命名空间冲突的概率。

(2) 循环嵌套导入的问题

如果两个模块相互导入,在使用from ... import时就可能带来循环嵌套导入的问题,例如:

m1.py:from m2 import x2def x1(): passm2.py:from m1 import x1def x2(): pass

导入上面任何一个文件都会抛出ImportError异常。在导入m1时,遇到语句from m2 import x2,此时m2不存在与于sys.modules中,因此此时转到导入m2.py文件。然后导入m2.py时,遇到语句from m1 import x1,此时m1已经在sys.module中存在,但是在字典中找x1,但是由于m1.py的导入之前并未完成,还没有x1,于是解释器便会抛出ImportError: cannot import name x1异常。直接使用import就没有这个问题。

欢迎大家关注小编~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值