域名

关于包导入,这三个知识点太多人不知道了

时间:2010-12-5 17:23:32  作者:IT科技类资讯   来源:域名  查看:  评论:0
内容摘要:1. 使用 __all__ 控制可被导入的变量使用 from module import * 默认情况下会导入 module 里的所有变量,若你只想从模块中导入其中几个变量,可以在 module 中使

1. 使用 __all__ 控制可被导入的关于变量

使用 from module import * 默认情况下会导入 module 里的所有变量,若你只想从模块中导入其中几个变量,包导不知可以在 module 中使用 __all__ 来控制想要被其他模块导入的知识变量。

# profile.py name=小明 age=18 __all__=[name] 

打开 python console 验证一下

>>> from profile import * >>> print(name) 小明 >>> print(age) Traceback (most recent call last):   File "<stdin>",点太多人道 line 1, in <module> NameError: name age is not defined 

__all__ 仅对于使用from module import * 这种情况适用。

它经常在一个包的关于 __init__.py 中出现。

2. 命名空间包的包导不知神奇之处

命名空间包,对于不少人来说,知识可能是点太多人道一个陌生的名字。

与我们熟悉的关于常规包不同的是,它没有 __init__.py 文件。包导不知

更为特殊的知识是,它可以跨空间地将两个不相邻的点太多人道子包,合并成一个虚拟机的关于包,云服务器我们将其称之为 命名空间包。包导不知

例如,知识一个项目的部分代码布局如下

foo-package/     spam/         blah.py bar-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 "<stdin>", line 1, in <module> AttributeError: module object has no attribute __file__ 

3. 模块重载中的一个坑

由于有 sys.modules 的存在,当你导入一个已导入的模块时,实际上是没有效果的。

为了达到模块的重载,有的人会将已导入的包从 sys.modules 中移除后再导入

就像下面这样子

>>> import foo.bar successful to be imported >>> >>> import foo.bar >>> >>> import sys >>> sys.modules[foo.bar] <module foo.bar from /Users/MING/Code/Python/foo/bar.py> >>> del sys.modules[foo.bar] >>> >>> import foo.bar successful to be imported 

上面的例子里我使用的源码库是import foo.bar ,如果你使用的是 from foo import bar 这种导入形式,会发现重载是同样是无效的。

这应该算是一个小坑,不知道的人,会掉入坑中爬不出来。

>>> import foo.bar successful to be imported >>> >>> import foo.bar >>> >>> import sys >>> del sys.modules[foo.bar] >>> from foo import bar >>> 

因此,在生产环境中可能需要避免重新加载模块。而在调试模式中,它会提供一定的便利,但你要知道这个重载的弊端,以免掉入坑里。

本文转载自微信公众号「Python编程时光」,可以通过以下二维码关注。转载本文请联系Python编程时光公众号。

云南idc服务商
copyright © 2025 powered by 益强资讯全景  滇ICP备2023006006号-31sitemap