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

Python 增強提案 (Python Enhancement Proposals)

PEP 3144 – Python 標準函式庫之 IP 位址操作函式庫

作者:
Peter Moody <pmoody at google.com>
BDFL-Delegate:
Alyssa Coghlan
討論於:
ipaddr-py-dev@googlegroups.com
狀態:
最終 (Final)
類型:
標準軌跡 (Standards Track)
建立日期:
2012年2月6日
Python 版本:
3.3
決議:
Python-Dev 訊息

目錄

摘要

本 PEP 提議為 Python 設計一個 IP 位址操作模組。

PEP 採納情形

本 PEP 已於 2012 年 5 月 15 日由 Alyssa Coghlan 採納。

動機

Python 目前已有數個相當優秀的 IP 位址模組。事實上,它們都在「堅持 Python 風格原則」與「網路工程師及管理員所依賴的簡寫慣例」兩者之間難以取得平衡。ipaddress 旨在取得正確的平衡。

原理

已有數個 Python IP 位址操作模組的存在,證明了本模組所欲提供的功能具有顯著的需求。

背景

PEP 3144ipaddr 過去曾被提議納入。此處指定的程式庫版本與 PyPI 上以及先前討論過的版本不相容。為了避免造成現有 ipaddr 使用者的混淆,我已將此版本的程式庫重新命名為 ipaddress

ipaddripaddress 的主要差異如下:

  • ipaddress 的 *Network 類別等同於 ipaddr 的 *Network 類別,並將 strict 旗標設為 True
  • ipaddress 的 *Interface 類別等同於 ipaddr 的 *Network 類別,並將 strict 旗標設為 False
  • ipaddress 中的工廠函式(factory functions)已重新命名,以避免與類別混淆。
  • 為了釐清用途,部分屬性也已重新命名。(例如:networknetwork_address
  • ipaddr 中原先會回傳容器(containers)的多個方法與函式,現在改為回傳迭代器(iterators)。這包含 subnetsaddress_excludesummarize_address_rangecollapse_address_list

由於 ipaddressipaddr 之間的 API 不相容,本提議建議以新的「暫定(provisional)」API 狀態加入該模組。

python-dev 上的相關討論串:

規範

ipaddr 模組總共定義了 6 個新的公開類別,其中 3 個用於操作 IPv4 物件,3 個用於操作 IPv6 物件。類別如下:

  • IPv4Address/IPv6Address - 定義個別位址。例如:透過 A 記錄查詢 www.google.com 所回傳的 IPv4 位址(74.125.224.84),或透過 AAAA 記錄查詢 ipv6.google.com 所回傳的 IPv6 位址(2001:4860:4001:801::1011)。
  • IPv4Network/IPv6Network - 定義網路或位址群組。例如:保留給多播(multicast)使用的 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

或查看包含 README 與單元測試的 tarball: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

最後修改日期:2025-02-01 08:59:27 GMT