Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

Python 增强提案

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 3144ipaddr 之前就曾考虑过纳入。此处指定的库版本与 PyPI 上的版本以及之前讨论过的版本不兼容。为了避免混淆当前 ipaddr 的用户,我将此库版本重命名为 ipaddress

ipaddr 和 ipaddress 之间的主要区别是

  • ipaddress 的 *Network 类等效于 ipaddr 的 *Network 类对应项,其中 strict 标志设置为 True
  • ipaddress 的 *Interface 类等效于 ipaddr 的 *Network 类对应项,其中 strict 标志设置为 False
  • ipaddress 中的工厂函数已重命名,以将其与类区分开来。
  • 一些属性也已重命名以明确其用途。(例如 networknetwork_address
  • ipaddr 中返回容器的许多方法和函数现在返回迭代器。这包括 subnetsaddress_excludesummarize_address_rangecollapse_address_list

由于 ipaddressipaddr 之间的向后不兼容的 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 - 提供 IPv4AddressIPv6Address 共有的方法。
  • _BaseInterface - 提供 IPv4InterfaceIPv6Interface 以及 IPv4NetworkIPv6Network 共有的方法(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