PEP 3144 – Python 标准库的 IP 地址操作库
- 作者:
- Peter Moody <pmoody at google.com>
- BDFL 委托:
- Alyssa Coghlan
- 讨论至:
- ipaddr-py-dev@googlegroups.com
- 状态:
- 最终版
- 类型:
- 标准跟踪
- 创建日期:
- 2012年2月6日
- Python 版本:
- 3.3
- 决议:
- Python-Dev 消息
摘要
本 PEP 提出了一个用于 Python 的 IP 地址操作模块的设计方案。
PEP 接受
本 PEP 于 2012 年 5 月 15 日被 Alyssa Coghlan 接受。
动机
现有的几个非常好的 Python IP 地址模块。事实是,所有这些模块都在坚持 Pythonic 原则和网络工程师及管理员所依赖的简写之间苦苦挣扎。ipaddress 旨在取得正确的平衡。
基本原理
几个 Python IP 地址操作模块的存在证明了对本模块旨在提供的功能有迫切的需求。
背景
PEP 3144 和 ipaddr 之前曾被提议纳入。此处指定的库版本与 PyPI 上的版本和之前讨论过的版本不兼容。为了避免混淆当前 ipaddr 的用户,我将此版本的库重命名为 ipaddress。
ipaddr 和 ipaddress 之间的主要区别是
- ipaddress*网络类等同于- ipaddr*网络类,并将- strict标志设置为- True。
- ipaddress*接口类等同于- ipaddr*网络类,并将- strict标志设置为- False。
- ipaddress中的工厂函数已重命名,以与类区分开来。
- 一些属性也已重命名,以区分其用途。(例如 network,network_address)
- ipaddr中返回容器的一些方法和函数现在返回迭代器。这包括- subnets、- address_exclude、- summarize_address_range和- collapse_address_list。
由于 ipaddress 和 ipaddr 之间的 API 发生了不兼容的更改,因此建议使用新的临时 API 状态添加该模块
python-dev 上的相关消息
规范
ipaddr 模块总共定义了 6 个新的公共类,其中 3 个用于操作 IPv4 对象,3 个用于操作 IPv6 对象。这些类如下:
- IPv4Address/- IPv6Address- 这些定义了单个地址,例如,通过对 www.google.com 进行 A 记录查询返回的 IPv4 地址 (74.125.224.84) 或通过对 ipv6.google.com 进行 AAAA 记录查询返回的 IPv6 地址 (2001:4860:4001:801::1011)。
- IPv4Network/- IPv6Network- 这些定义了网络或地址组,例如,为多播使用保留的 IPv4 网络 (224.0.0.0/4) 或为多播保留的 IPv6 网络 (ff00::/8,哇,这可真大)。
- IPv4Interface/- IPv6Interface- 这些混合类指的是给定网络上的单个地址。例如,网络 192.0.2.0/24 上的 IPV4 地址 192.0.2.1 可以表示为 192.0.2.1/24。同样,网络 2001:DB8::/96 上的 IPv6 地址 2001:DB8::1 可以表示为 2001:DB8::1/96。将分配给计算机网络接口的地址这样表示非常常见,因此得名 Interface。
所有 IPv4 类都共享某些特性和方法;表示它们所需的位数,它们是否属于某些特殊的 IPv4 网络范围等。同样,所有 IPv6 类都共享特性和方法。
ipaddr 大量使用继承来尽可能避免代码重复。父类是私有的,但在此处列出:
- _IPAddrBase- 提供所有- ipaddr对象通用的方法。
- _BaseAddress- 提供- IPv4Address和- IPv6Address通用的方法。
- _BaseInterface- 提供- IPv4Interface和- IPv6Interface以及- IPv4Network和- IPv6Network通用的方法(- ipaddr将网络类视为接口的一种特殊情况)。
- _BaseV4- 提供所有 IPv4 类通用的方法和变量(例如,- _max_prefixlen)。
- _BaseV6- 提供所有 IPv6 类通用的方法和变量。
不同 IP 版本对象之间的比较会导致 TypeError [1]。此外,具有不同 _Base 父类的对象比较也会导致 TypeError。_Base 父类限制的作用是 IPv4Interface 可以与 IPv4Network 进行比较,而 IPv6Interface 可以与 IPv6Network 进行比较。
参考实现
当前的参考实现可以在以下网址找到
http://code.google.com/p/ipaddress-py/source/browse/ipaddress.py
或者查看 tar 包以包含 README 和单元测试。http://code.google.com/p/ipaddress-py/downloads/detail?name=ipaddress-1.0.tar.gz
有关使用参考实现的更多信息,请访问:http://code.google.com/p/ipaddr-py/wiki/Using3144
参考资料
版权
本文档已置于公共领域。
来源:https://github.com/python/peps/blob/main/peps/pep-3144.rst