当然,你还可以使用from方法导入模块的全部内容,就像这样:
from os import *
这种做法在少数情况下是挺方便的 , 但是这样也会打乱你的命名空间 。问题在于,你可能定义了一个与导入模块中名称相同的变量或函数 , 这时如果你试图使用
os 模块中的同名变量或函数,实际使用的将是你自己定义的内容 。因此 , 你最后可能会碰到一个相当让人困惑的逻辑错误 。
标准库中我唯一推荐全盘导入的模块只有Tkinter。
如果你正好要写自己的模块或包,有人会建议你在 __init__.py 文件中导入所有内容,让模块或者包使用起来更方便 。我个人更喜欢显示地导入 , 而非隐式地导入 。
你也可以采取折中方案,从一个包中导入多个项:
from os import path, walk, unlinkfrom os import uname, remove
在上述代码中,我们从 os 模块中导入了5个函数 。你可能注意到了,我们是通过多次从同一个模块中导入实现的 。当然,如果你愿意的话,你也可以使用圆括号一次性导入多个项:
from os import (path, walk, unlink, uname,
remove, rename)
这是一个有用的技巧,不过你也可以换一种方式:
from os import path, walk, unlink, uname, \
remove, rename
上面的反斜杠是Python中的续行符 , 告诉解释器这行代码延续至下一行 。
相对导入
PEP 328 介绍了引入相对导入的原因,以及选择了哪种语法 。具体来说,是使用句点来决定如何相对导入其他包或模块 。这么做的原因是为了避免偶然情况下导入标准库中的模块产生冲突 。这里我们以PEP 328中给出的文件夹结构为例,看看相对导入是如何工作的:
my_package/
__init__.py
subpackage1/
__init__.py
module_x.py
module_y.py
subpackage2/
__init__.py
module_z.py
module_a.py
在本地磁盘上找个地方创建上述文件和文件夹 。在顶层的 __init__.py 文件中,输入以下代码:
from . import subpackage1from . import subpackage2
接下来进入 subpackage1 文件夹,编辑其中的 __init__.py 文件,输入以下代码:
from . import module_xfrom . import module_y
现在编辑 module_x.py 文件,输入以下代码:
from .module_y import spam as ham
def main():
ham()
最后编辑 module_y.py 文件,输入以下代码:
def spam():
print('spam ' * 3)
打开终端,cd 至 my_package 包所在的文件夹,但不要进入 my_package。在这个文件夹下运行Python解释器 。我使用的是IPython,因为它的自动补全功能非常方便:
In [1]: import my_package
In [2]: my_package.subpackage1.module_xOut[2]: module
'my_package.subpackage1.module_x' from
'my_package/subpackage1/module_x.py'
In [3]: my_package.subpackage1.module_x.main()spam spam spam
相对导入适用于你最终要放入包中的代码 。如果你编写了很多相关性强的代码,那么应该采用这种导入方式 。
你会发现PyPI上有很多流行的包也是采用了相对导入。还要注意一点,如果你想要跨越多个文件层级进行导入 , 只需要使用多个句点即可 。不过 , PEP
328建议相对导入的层级不要超过两层。
还要注意一点 , 如果你往 module_x.py 文件中添加了 if __name__ == ‘__main__’ ,然后试图运行这个文件,你会碰到一个很难理解的错误 。编辑一下文件,试试看吧!
from . module_y import spam as ham
def main():
ham()
if __name__ == '__main__':
# This won't work!
main()
现在从终端进入 subpackage1 文件夹,执行以下命令:
python module_x.py
- 如何使用cmd命令行提示符登录mysql服务器 cmd中登陆mysql
- mysql怎么设置时区 mysql时间显示设置
- 招聘要精通mysql
- mysql 65535 8192 限制 mysql限制资源使用
- mysql有topn
- mysql协议包解析 mysqlicp协议
- mysql子查询和连接查询 mysql子查询插入
- Mysql使用索引查询 mysql使用round
- redis实现延时消息队列 redis消息时间过长
- redis的热点数据缓存 redis热点数据切换
