当前位置: 首页 > 科技观察

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

时间:2023-03-20 10:37:23 科技观察

1。使用__all__控制可以导入的变量。使用frommoduleimport*默认情况下,将导入模块中的所有变量。如果只想导入from模块中导入几个变量,可以在模块中使用__all__来控制要被其他模块导入的变量。#profile.pyname='Xiaoming'age=18__all__=['name']打开python控制台验证>>>fromprofileimport*>>>print(name)Xiaoming>>>print(age)Traceback(mostrecentcallast):File"",line1,inNameError:name'age'isnotdefined__all__仅在使用frommoduleimport*时适用。它经常出现在包的__init__.py中。2、命名空间包的神奇之处命名空间包对于很多人来说可能是一个陌生的名字。与我们熟悉的常规包不同,这里没有__init__.py文件。更具体地说,它可以将两个不相邻的子包跨空间合并为一个虚拟机包,我们称之为命名空间包。比如某项目的部分代码布局如下:foo-package/spam/blah.pybar-package/spam/grok.py在这两个目录下,有一个公共的命名空间spam。两个目录中都没有__init__.py文件。让我们看看,如果将foo-package和bar-package都添加到python模块路径并尝试导入会发生什么?>>>importsys>>>sys.path.extend(['foo-package','bar-package'])>>>importspam.blah>>>importspam.grok>>>当包是命名空间包时,它不再像常规包那样具有__file_属性,而是__path__>>>importsys>>>sys.path.extend(['foo-package','bar-package'])>>>importspam.blah>>>importspam.grok>>>spam.__path___NamespacePath(['foo-package/spam','bar-package/spam'])>>>spam.__file__Traceback(mostrecentcallast):File"",line1,inAttributeError:'module'objecthasnoattribute'__file__'3.其中一个模块重载的坑由于sys.modules的存在,当你导入一个导入的模块时,它实际上没有任何作用。有些人为了实现模块重载,会把导入的包从sys.modules中去掉,然后这样导入>>>importfoo.barsuccessfultobeimported>>>>>>importfoo.bar>>>>>>importsys>>>sys.modules['foo.bar']>>>delsys.modules['foo.bar']>>>>>>importfoo.barsuccessfultobeimported在上面的例子中,我使用了importfoo.bar。如果你使用fromfooimportbar的导入形式,你会发现重载也是无效的。这应该算是一个小坑。不知道的人会掉进坑里爬不出来。>>>importfoo.barsuccessfultobeimported>>>>>>importfoo.bar>>>>>>importsys>>>delsys.modules['foo.bar']>>>fromfooimportbar>>>因此,在生产环境中你可能需要避免重新加载模块。在调试模式下,它会提供一定的便利,但是你需要知道这种重载的缺点,以免掉坑里。本文转载自微信公众号《Python编程时间》,可通过以下二维码关注。转载本文请联系Python编程时间公众号。