1. 使用 __all__ 控制可被导入的变量 使用 from module import * 默认情况下会导入 module 里的所有变量,若你只想从模块中导入其中几个变量,可以在 module 中使用 __all__ 来控制想要被其他模块导入的变量。
# profile.pyname='小明'age=18__all__=['name'] 打开 python console 验证一下
>>> from profile import *>>> print(name)小明>>> print(age)traceback (most recent call last): file , line 1, in nameerror: name 'age' is not defined __all__ 仅对于使用from module import * 这种情况适用。
它经常在一个包的 __init__.py 中出现。
2. 命名空间包的神奇之处 命名空间包,一个陌生的名字。
与我们熟悉的常规包不同的是,它没有 __init__.py 文件。
更为特殊的是,它可以跨空间地将两个不相邻的子包,合并成一个虚拟机的包,我们将其称之为 命名空间包。
例如,一个项目的部分代码布局如下
foo-package/ spam/ blah.pybar-package/ spam/ grok.py 在这2个目录里,都有着共同的命名空间spam。在任何一个目录里都没有__init__.py文件。
让我们看看,如果将foo-package和bar-package都加到python模块路径并尝试导入会发生什么?
>>> import sys>>> sys.path.extend(['foo-package', 'bar-package'])>>> import spam.blah>>> import spam.grok 当一个包为命名空间包时,他就不再和常规包一样具有 __file_ 属性,取而代之的是 __path__
>>> import sys>>> sys.path.extend(['foo-package', 'bar-package'])>>> import spam.blah>>> import spam.grok>>> spam.__path___namespacepath(['foo-package/spam', 'bar-package/spam'])>>> spam.__file__traceback (most recent call last): file , line 1, in attributeerror: 'module' object has no attribute '__file__' 3. 模块重载中的一个坑 由于有 sys.modules 的存在,当你导入一个已导入的模块时,实际上是没有效果的。
为了达到模块的重载,有的人会将已导入的包从 sys.modules 中移除后再导入
就像下面这样子
>>> import foo.barsuccessful to be imported>>>>>> import foo.bar>>>>>> import sys>>> sys.modules['foo.bar']>>> del sys.modules['foo.bar']>>>>>> import foo.barsuccessful to be imported 上面的例子里我使用的是import foo.bar ,如果你使用的是 from foo import bar 这种导入形式,会发现重载是同样是无效的。
这应该算是一个小坑,不知道的人,会掉入坑中爬不出来。
>>> import foo.barsuccessful to be imported>>>>>> import foo.bar>>>>>> import sys>>> del sys.modules['foo.bar']>>> from foo import bar 因此,在生产环境中可能需要避免重新加载模块。而在调试模式中,它会提供一定的便利,但你要知道这个重载的弊端,以免掉入坑里。
LED显示屏微创新打开十大蓝海市场
ESD是如何进入电子设备生产过程中的
FPGA篇:业内两强继续领跑,后起之秀凭收购及新技术紧追
vivo 5G手机蓝动夏日活动正式开启 X50系列火爆销售中
xtr105电路原理图 xtr105中文资料应用电路图 英文数据手册
关于python包导入的三个冷门知识点
乐视倒闭?利好从港传来 乐视欠薪者收到上上个月的工资
华为确认折叠旗舰Mate X2将搭载麒麟9000
声级校准器怎么用 声级校准器发出多大的恒定声压
一氧化碳传感器在地下车库监测系统中的应用介绍
微软:搭载M1的Mac设备上可运行Windows 10
谁说蓝牙耳机没有好音质 先看看这些蓝牙耳机方案再下决定吧!
基于openEuler+k8s+iSula的分布式核心系统容器化解决方案
投影机技术类型及规格
vivo S1 Pro新手机已在vivo官网上架搭载骁龙675支持vivo双引擎闪充
中国首款增程式SUV成了 12月销量暴涨超500%!
支付市场上,银联、支付宝、微信支付“三国杀”的局面或将成为历史
Landau-Siegel零点猜想是什么?
linux内核空间到用户空间数据传输-Relay
联通的新4G网络能力明显增强 强在哪?