0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详解python常规包与命名空间包

python爬虫知识分享 来源:python爬虫知识分享 作者:python爬虫知识分享 2022-03-11 15:46 次阅读

python常规包与命名空间包

1. 常规包

在 Python 3.3 之前或者说 Python 2 中,一个包想要被导入使用,那么该包内必须要有 __init__.py 文件,这个文件是 Python 识别一个文件夹是否是一个 Python 的重要标志。

举个例子,现在有如下的目录树,demo 及子文件夹 foo 和 bar 下都有 __init__.py 文件。

$ tree demo/
demo/
├── bar
│ └── __init__.py
├── foo
│ └── __init__.py
└── __init__.py

在该目录下进入 Python Console 模式,然后就可以正常导入了

>>> import demo
>>> import demo.bar
>>> import demo.foo

如果此时我把 demo 目录下的 __init__.py 删除

$ tree demo/
demo/
├── bar
│ └── __init__.py
└── foo
    └── __init__.py

再导入就会报错。

>>> import demo
Traceback (most recent call last):
  File "", line 1, in 
ImportError: No module named demo

2. 命名空间包

在 Python 3.3 之后(PEP 420),即使一个文件夹中没有定义 __init__.py,也是可以被导入的,只不过它不是以 Python 包的形式导入,而是以命名空间包 (Namespace package) 的形式被导入,而这一特性是在 Python 3.3 被引入的。

比如还是上面的目录结构:

$ tree demo/
demo/
├── bar
│ └── __init__.py
└── foo
    └── __init__.py

在 Python 3 下进入 Python Console 模式,发现导入是正常的

>>> import demo
>>> import demo.foo
>>> import demo.bar

使用 __path__ 查看一下,发现 demo 不再是一个常规包了,而是一个 namespace package

>>> demo

>>>
>>> demo.__path__
_NamespacePath(['/root/python/demo'])

3. 空间命名包的好处

利用命名空间包这个技术,可以用来导入目录分散的代码。

比如有如下的目录树

$ tree
.
├── xc-pkg
│ └── demo
│     └── foo
│         └── __init__.py
└── xm-pkg
    └── demo
        └── bar
            └── __init__.py

在这 xc-pkgxm-pkg 这两个目录里,都有着共同的命名空间 demo。这时候再导入这两个包的时候,发现这两个包被合并到一起了

>>> import sys
>>> sys.path.extend(['xm-pkg', 'xc-pkg'])
>>>
>>> import demo.foo
>>> import demo.bar
>>> demo

在这里工作的机制被称为命名空间包的一个特征。从本质上讲,命名空间包是一种特殊的封装设计,为合并不同的目录的代码到一个共同的命名空间。

命名空间包的关键是确保顶级目录中没有 __init__.py 文件来作为共同的命名空间。缺失 __init__.py 文件使得在导入包的时候会发生有趣的事情:这并没有产生错误,解释器创建了一个由所有包含匹配包名的目录组成的列表。特殊的包命名空间模块被创建,只读的目录列表副本被存储在其 __path__ 变量中。

>>> demo.__path__
_NamespacePath(['xm-pkg/demo', 'xc-pkg/demo'])

一个包是否被作为一个包命名空间的主要方法是检查其 __file__ 属性。如果没有,那包是个命名空间。这也可以由其字符表现形式中的 namespace 这个词体现出来。

>>> demo

>>>
>>> demo.__file__
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: module 'demo' has no attribute '__file__'

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 结构
    +关注

    关注

    1

    文章

    117

    浏览量

    21597
  • 空间
    +关注

    关注

    2

    文章

    48

    浏览量

    13629
  • python
    +关注

    关注

    56

    文章

    4796

    浏览量

    84664
收藏 人收藏

    评论

    相关推荐

    mtu配置步骤详解 mtu与数据丢失的关系

    MTU(Maximum Transmission Unit)即最大传输单元,是指一种通信协议的某一层上面所能通过的最大数据报大小,单位是字节。MTU配置步骤及其与数据丢失的关系如下: MTU配置
    的头像 发表于 12-16 14:33 485次阅读

    CentOS中使用tcpdump抓

    CentOS中使用tcpdump抓
    的头像 发表于 10-28 14:48 245次阅读

    什么是膜压方线?

    而成,工艺过程中新增加了压方工序,使得各股线间隙更小,整线密度更高。 相比于常规线,膜压方线在相同股数下线径可减小50%,可以有效减小磁性元件绕组的体积,为新能源汽车节省更多空间
    的头像 发表于 10-16 11:33 206次阅读
    什么是膜<b class='flag-5'>包</b>压方线?

    安装依赖的Python软件时报错如何解决?

    安装依赖的 Python 软件,出现了如下错误,请问如何解决,谢谢! Command \"E:/msys32/mingw32/bin/python2.7.exe E:/msys32
    发表于 06-26 07:32

    什么是小圆柱软电池?小圆柱软电池的优缺点?

    小圆柱软电池是一种锂离子电池,它结合了小圆柱电池的外形和软电池的封装特性。
    的头像 发表于 05-07 11:23 765次阅读

    电池和硬电池的区别有哪些呢?

    电池和硬电池是两种不同类型的锂离子电池封装方式,它们在材料、结构、性能以及应用领域上都存在显著的区别。
    的头像 发表于 05-07 10:25 1w次阅读

    储能电池ccs结构介绍 储能电池的结构原理是什么?

    储能电池CCS结构介绍 储能电池(Energy Storage Battery Pack,简称ESBP)是一种用于存储电能的设备,广泛应用于电动汽车、可再生能源、电网调节等领域。储能电池的结构
    的头像 发表于 04-29 14:32 2231次阅读

    什么是软电池?软电池就是石墨烯电池吗?

    电池是一种锂离子电池,其名称来源于其独特的封装方式。与传统的圆柱形或方形硬壳电池不同,软电池使用铝塑复合膜作为外壳材料,这种软性包装材料为电池提供了更大的设计灵活性和一些独特的性能优势。
    的头像 发表于 04-28 17:40 1895次阅读

    锂电池软和硬哪个好

    锂电池作为现代电子设备和电动汽车的主要电源,其封装形式主要分为软和硬两种。
    的头像 发表于 04-28 17:22 7353次阅读

    DPDK在AI驱动的高效数据处理应用

    传统的数据处理方式是数据先到内核最后再到用户层进行处理。这种方式会增加额外的延迟和CPU开销,严重影响数据处理的性能。 DPDK 绕过内核,在用户空间中实现快速数据
    的头像 发表于 02-25 11:28 934次阅读
    DPDK在AI驱动的高效数据<b class='flag-5'>包</b>处理应用

    CFP5-FL;SMD卷轴SOD128FL-1装信息

    电子发烧友网站提供《CFP5-FL;SMD卷轴SOD128FL-1装信息.pdf》资料免费下载
    发表于 02-05 09:52 0次下载
    CFP5-FL;SMD卷轴<b class='flag-5'>包</b>SOD128FL-1<b class='flag-5'>包</b>装信息

    HWSON8;SMD卷轴SOT8067-1装信息

    电子发烧友网站提供《HWSON8;SMD卷轴SOT8067-1装信息.pdf》资料免费下载
    发表于 02-05 09:43 0次下载
    HWSON8;SMD卷轴<b class='flag-5'>包</b>SOT8067-1<b class='flag-5'>包</b>装信息

    DFN2020-6;SMD卷轴SOT1220-3装信息

    电子发烧友网站提供《DFN2020-6;SMD卷轴SOT1220-3装信息.pdf》资料免费下载
    发表于 02-05 09:29 1次下载
    DFN2020-6;SMD卷轴<b class='flag-5'>包</b>SOT1220-3<b class='flag-5'>包</b>装信息

    电池优劣势有哪些?

    电池优劣势有哪些? 软电池是一种新型的电池类型,相对于传统的硬电池有着一些优势和劣势。 第一部分:引言 软电池是一种采用软式包装
    的头像 发表于 01-10 10:30 2723次阅读

    平铺电池已经过时了吗?

    抛弃平铺电池,用高功率密度小电机解放前后桥扩展电池,牺牲(有限的)续航和规整空间的实用性。靠更好的自建补能,靠“坐姿、头部空间、车身高度和线条”的优势(依需求不同分配侧重点),创造
    发表于 12-27 17:18 364次阅读
    平铺电池<b class='flag-5'>包</b>已经过时了吗?