Python 高手编程系列一千零四十七:PEP 420 — 隐式命名空间包

如果你只使用 Python 3、也只面向 Python 3 的用户,那么有好消息要告诉你。PEP 420
(隐式命名空间包,Implicit Namespace Packages)引入了一种定义命名空间包的新方法。
它是标准路径的一部分,并从 3.3 版开始成为语言官方内容的一部分。简而言之,对于每
个包含 Python 包或模块(也包括命名空间包)的目录来说,如果它不包含__init__.py
文件,那么它就被看作是命名空间包。下面是上一节介绍的文件结构示例:
$ tree acme.sql/
acme.sql/
├── acme
│ └── sql
│ └── __init __.py
└── setup.py
2 directories, 2 files
$ tree acme.templating/
acme.templating/
├── acme
│ └── templating
│ └── __init __.py
└── setup.py
2 directories, 2 files
在 Python 3.3 以及更高版本中,这些足以说明 acme 是一个命名空间包。使用安装工
具的最小 setup.py 脚本如下所示:
from setuptools import setup
setup(
name=‘acme.templating’,
packages=[‘acme.templating’],
)
不幸的是,在写作本书时,setuptools.find_packages()还不支持 PEP 420。不
管怎样,这在未来可能会改变。此外,要想实现命名空间包的简单集成,要求显示地定义
包列表似乎只是非常小的代价。
以前 Python 版本中的命名空间包
在 3.3 版以前的 Python 版本中,无法使用 PEP 420 布局中的命名空间包。但是这个概
念非常古老,也常用于像 Zope 这样的成熟项目,因此完全可以使用它,但是没有隐式定义。
在旧版 Python 中,有几种方法可以将包定义为命名空间。
最简单的方法就是为每个组件创建一个文件结构,类似于没有命名空间包的普通包布
局,并将所有事情都留给 setuptools。因此,acme.sql 和 acme.templating 的布
局示例可能如下所示:
$ tree acme.sql/
acme.sql/
├── acme
│ ├── __init __.py
│ └── sql
│ └── __init __.py
└── setup.py
2 directories, 3 files
$ tree acme.templating/
acme.templating/
├── acme
│ ├── __init __.py
│ └── templating
│ └── __init __.py
└── setup.py
2 directories, 3 files
注意,acme.sql 和 acme.templating 都有一个额外的源代码文件 acme/__init
__.py。这个文件必须是空的。如果我们提供 acme 作为 setuptools.setup()函数的
namespace_packages 关键字参数的值,那么将会创建如下的 acme 命名空间包:
from setuptools import setup
setup(
name=‘acme.templating’,
packages=[‘acme.templating’],
namespace_packages=[‘acme’],
)
最简单的方法不一定是最好的。为了注册一个新的命名空间,setuptools 将会在
init.py 文 件 中 调 用 pkg_resources.declare_namespace() 函 数 。 即 使
init.py 文件是空的也会调用。无论如何,正如官方文档所说,你自己负责在
init.py 文件中声明命名空间,并且未来可能会删除 setuptools 的这个隐式行为。
为了保证安全,也为了未来依然可用(future-proof),你需要将下面这行代码添加到
acme/init.py 文件中:
import(‘pkg_resources’).declare_namespace(name)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值