PEP 3144 – Python 표준 라이브러리를 위한 IP 주소 조작 라이브러리
- Author:
- Peter Moody <pmoody at google.com>
- BDFL-Delegate:
- Alyssa Coghlan
- Discussions-To:
- ipaddr-py-dev@googlegroups.com
- Status:
- Final
- Type:
- Standards Track
- Created:
- 06-Feb-2012
- Python-Version:
- 3.3
- Resolution:
- Python-Dev message
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
이 PEP는 Python을 위한 IP 주소 조작 모듈의 설계를 제안합니다.
PEP 수락
이 PEP는 2012년 5월 15일에 Alyssa Coghlan이 수락했습니다.
동기
Python을 위한 매우 훌륭한 IP 주소 모듈이 이미 여럿 존재합니다. 하지만 실제로는 그 모든 모듈이 파이썬다운 원칙을 지키는 것과 네트워크 엔지니어 및 관리자가 의존하는 약식 표기 사이에서 균형을 잡는 데 어려움을 겪고 있습니다. ipaddress는 적절한 균형을 잡는 것을 목표로 합니다.
근거
여러 Python IP 주소 조작 모듈이 존재한다는 사실은 이 모듈이 제공하려는 기능에 대한 해결되지 않은 요구가 있다는 증거입니다.
배경
PEP 3144와 ipaddr는 이전에도 표준 라이브러리에 포함하는 것이 검토된 적이 있습니다. 여기에서 명세하는 라이브러리 버전은 PyPI에 있는 버전 및 이전에 논의된 버전과 하위 호환되지 않습니다. 현재 ipaddr 사용자의 혼란을 피하기 위해 이 버전의 라이브러리 이름을 ipaddress로 바꾸었습니다.
ipaddr와 ipaddress의 주요 차이점은 다음과 같습니다:
ipaddress의 *Network 클래스는strict플래그를True로 설정한ipaddr의 대응하는 *Network 클래스와 동등합니다.ipaddress의 인터페이스 클래스(*Interface)는strict플래그를False로 설정한ipaddr의 대응 네트워크 클래스(*Network)와 동등합니다.ipaddress의 팩토리 함수는 클래스와 구별되도록 이름이 바뀌었습니다.- 몇몇 속성도 용도를 명확히 하기 위해 이름을 바꾸었습니다. (예:
network,network_address) ipaddr에서 컨테이너를 반환하던 여러 메서드와 함수가 이제 이터레이터를 반환합니다. 여기에는subnets,address_exclude,summarize_address_range,collapse_address_list가 포함됩니다.
ipaddress와 ipaddr 사이의 하위 호환되지 않는 API 변경 때문에, 새로운 잠정(provisional) 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
또는 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
참고 문헌
Copyright
This document has been placed in the public domain.