Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

PEP 3144 – IP-Adressen-Manipulationsbibliothek für die Python-Standardbibliothek

Autor:
Peter Moody <pmoody at google.com>
BDFL-Delegate:
Alyssa Coghlan
Discussions-To:
ipaddr-py-dev@googlegroups.com
Status:
Final
Typ:
Standards Track
Erstellt:
06-Feb-2012
Python-Version:
3.3
Resolution:
Python-Dev Nachricht

Inhaltsverzeichnis

Zusammenfassung

Dieses PEP schlägt ein Design für ein Modul zur Manipulation von IP-Adressen für Python vor.

PEP-Akzeptanz

Dieses PEP wurde von Alyssa Coghlan am 15. Mai 2012 angenommen.

Motivation

Es gibt bereits mehrere sehr gute IP-Adressen-Module für Python. Die Wahrheit ist, dass alle mit dem Gleichgewicht zwischen der Einhaltung der Pythonic-Prinzipien und der Kürze, auf die sich Netzwerk-Ingenieure und Administratoren verlassen, kämpfen. ipaddress zielt darauf ab, die richtige Balance zu finden.

Begründung

Die Existenz mehrerer Python-Module zur Manipulation von IP-Adressen ist ein Beweis für einen herausragenden Bedarf an der Funktionalität, die dieses Modul bereitstellen soll.

Hintergrund

PEP 3144 und ipaddr waren bereits für die Aufnahme vorgeschlagen worden. Die hier spezifizierte Version der Bibliothek ist abwärtskompatibel mit der Version auf PyPI und der, die zuvor diskutiert wurde. Um Benutzer des aktuellen ipaddr nicht zu verwirren, habe ich diese Version der Bibliothek ipaddress genannt.

Die Hauptunterschiede zwischen ipaddr und ipaddress sind:

  • ipaddress *Netzwerkklassen sind äquivalent zu den ipaddr *Netzwerkklassen-Gegenstücken mit dem strict-Flag auf True gesetzt.
  • ipaddress *Schnittstellenklassen sind äquivalent zu den ipaddr *Netzwerkklassen-Gegenstücken mit dem strict-Flag auf False gesetzt.
  • Die Factory-Funktionen in ipaddress wurden umbenannt, um sie von Klassen zu unterscheiden.
  • Einige Attribute wurden umbenannt, um ihren Zweck zu verdeutlichen. (z.B. network, network_address)
  • Eine Reihe von Methoden und Funktionen, die in ipaddr Container zurückgaben, geben nun Iteratoren zurück. Dazu gehören subnets, address_exclude, summarize_address_range und collapse_address_list.

Aufgrund der abwärtskompatiblen API-Änderungen zwischen ipaddress und ipaddr wird vorgeschlagen, das Modul mit dem neuen Status einer provisorischen API hinzuzufügen.

Relevante Nachrichten auf python-dev

Spezifikation

Das Modul ipaddr definiert insgesamt 6 neue öffentliche Klassen, 3 für die Manipulation von IPv4-Objekten und 3 für die Manipulation von IPv6-Objekten. Die Klassen sind wie folgt:

  • IPv4Address/IPv6Address - Diese definieren einzelne Adressen, zum Beispiel die IPv4-Adresse, die von einer A-Record-Abfrage für www.google.com zurückgegeben wird (74.125.224.84) oder die IPv6-Adresse, die von einer AAAA-Record-Abfrage für ipv6.google.com zurückgegeben wird (2001:4860:4001:801::1011).
  • IPv4Network/IPv6Network - Diese definieren Netzwerke oder Gruppen von Adressen, zum Beispiel das für Multicast-Nutzung reservierte IPv4-Netzwerk (224.0.0.0/4) oder das für Multicast reservierte IPv6-Netzwerk (ff00::/8, wow, das ist groß).
  • IPv4Interface/IPv6Interface - Diese Hybridklassen beziehen sich auf eine einzelne Adresse in einem gegebenen Netzwerk. Zum Beispiel kann die IPv4-Adresse 192.0.2.1 im Netzwerk 192.0.2.0/24 als 192.0.2.1/24 referenziert werden. Ebenso kann die IPv6-Adresse 2001:DB8::1 im Netzwerk 2001:DB8::/96 als 2001:DB8::1/96 referenziert werden. Es ist sehr üblich, Adressen, die Netzwerkschnittstellen von Computern zugewiesen sind, auf diese Weise zu referenzieren, daher der Name Interface.

Alle IPv4-Klassen teilen sich bestimmte Merkmale und Methoden; die Anzahl der Bits, die benötigt werden, um sie darzustellen, ob sie zu bestimmten speziellen IPv4-Netzwerkbereichen gehören usw. Ebenso teilen sich alle IPv6-Klassen Merkmale und Methoden.

ipaddr nutzt extensiv Vererbung, um Code-Duplizierung so weit wie möglich zu vermeiden. Die Elternklassen sind privat, aber hier skizziert:

  • _IPAddrBase - Bietet Methoden, die für alle ipaddr-Objekte gemeinsam sind.
  • _BaseAddress - Bietet Methoden, die für IPv4Address und IPv6Address gemeinsam sind.
  • _BaseInterface - Bietet Methoden, die für IPv4Interface und IPv6Interface sowie für IPv4Network und IPv6Network gemeinsam sind ( ipaddr behandelt die Netzwerkklassen als Sonderfall von Interface).
  • _BaseV4 - Bietet Methoden und Variablen (z.B. _max_prefixlen) für alle IPv4-Klassen gemeinsam.
  • _BaseV6 - Bietet Methoden und Variablen, die für alle IPv6-Klassen gemeinsam sind.

Vergleiche zwischen Objekten unterschiedlicher IP-Versionen führen zu einem TypeError [1]. Zusätzlich führen Vergleiche von Objekten mit unterschiedlichen _Base-Elternklassen zu einem TypeError. Die Auswirkung der Einschränkung der _Base-Elternklasse ist, dass IPv4Interface’s mit IPv4Network’s und IPv6Interface’s mit IPv6Network’s verglichen werden können.

Referenzimplementierung

Die aktuelle Referenzimplementierung finden Sie unter:

http://code.google.com/p/ipaddress-py/source/browse/ipaddress.py

Oder sehen Sie sich das Tarball an, um die README-Datei und die Unittests einzuschließen: http://code.google.com/p/ipaddress-py/downloads/detail?name=ipaddress-1.0.tar.gz

Weitere Informationen zur Verwendung der Referenzimplementierung finden Sie unter: http://code.google.com/p/ipaddr-py/wiki/Using3144

Referenzen


Quelle: https://github.com/python/peps/blob/main/peps/pep-3144.rst

Zuletzt geändert: 2025-02-01 08:59:27 GMT