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 3144 和 ipaddr 過去曾被提議納入。此處指定的程式庫版本與 PyPI 上以及先前討論過的版本不相容。為了避免造成現有 ipaddr 使用者的混淆,我已將此版本的程式庫重新命名為 ipaddress。
ipaddr 與 ipaddress 的主要差異如下:
ipaddress的 *Network 類別等同於ipaddr的 *Network 類別,並將strict旗標設為True。ipaddress的 *Interface 類別等同於ipaddr的 *Network 類別,並將strict旗標設為False。ipaddress中的工廠函式(factory functions)已重新命名,以避免與類別混淆。- 為了釐清用途,部分屬性也已重新命名。(例如:
network、network_address) - 在
ipaddr中原先會回傳容器(containers)的多個方法與函式,現在改為回傳迭代器(iterators)。這包含subnets、address_exclude、summarize_address_range和collapse_address_list。
由於 ipaddress 和 ipaddr 之間的 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- 提供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
或查看包含 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
參考文獻
版權
此文件已歸入公有領域 (public domain)。
來源:https://github.com/python/peps/blob/main/peps/pep-3144.rst
最後修改日期:2025-02-01 08:59:27 GMT