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
的 *Network 类等效于ipaddr
的 *Network 类对应项,其中strict
标志设置为True
。ipaddress
的 *Interface 类等效于ipaddr
的 *Network 类对应项,其中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
将 Network 类视为 Interface 的特例)。_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
或者查看 tarball 以包含 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
上次修改时间:2023-10-11 12:05:51 GMT