[Python-Dev] PEP 3144 ipaddr module (was Re: PEP 408 -- Standard library __preview__ package)

Nick Coghlan ncoghlan at gmail.com
Mon Jan 30 22:44:26 CET 2012

On Tue, Jan 31, 2012 at 4:19 AM, Scott Dial
<scott+python-dev at scottdial.com> wrote:
> PEP 3144 wasn't pronounced upon because there were significant
> disagreements about the design of the API proposed in the PEP. As it
> stands, I believe the authorship of ipaddr either decided that they were
> not going to compromise their module or lost interest.
> See Nick Coghlan's summary:
> http://mail.python.org/pipermail//python-ideas/2011-August/011305.html

Peter Moody actually addressed all my comments from last year (alas, I
forgot that python-ideas got dropped from the latter part of the email
chain, so it became a private discussion between Peter, Guido and
myself). I apparently got distracted by other issues and never
followed up on Peter's final review request. The branch with the
relevant changes is here (these weren't added back into ipaddr
mainline since they aren't all backwards compatible with the existing
ipaddr API): http://code.google.com/p/ipaddr-py/source/browse/#svn%2Fbranches%2F3144

Peter was very responsive and accommodating during that discussion :)

(The notes below are an edited version of Peter's off-list reply to me
from last year, reflecting the final state of the ipaddr 3144 branch)

On Mon, Aug 29, 2011 at 7:09 PM, Nick Coghlan <ncoghlan at gmail.com> wrote:

    I believe the PEP would be significantly more palatable with the
    following changes/additions:
    1. Draft ReStructuredText documentation for inclusion in the stdlib docs

(still needed)

    2. Removal of the "ip" attribute of IP network objects (since it makes
    the nominal "networks" behave like IP interface definitions)

the Class hierarchy now looks like:

_IPAddrBase(object) # mother of everything
_BaseAddress(_IPAddrBase) # base for addresses
_ BaseNetwork(_IPAddrBase) # base for networks and interfaces, could
use be renamed.
_BaseV4(object) # ipv4 base
_BaseV6(object) # ipv6 base

IPv4Address(_BaseV4, _BaseAddress)
IPv4Interface(_BaseV4, _BaseNetwork)

IPv6Address(_BaseV6, _BaseAddress)
IPv6Interface(_BaseV6, _BaseNetwork)

(essentially, the current ipaddr "Network" objects become "Interface"
objects in PEP 3144, with a new strict "Network" object that has no ip

    3. "network" property renamed to "netaddr" (since it returns an
    address object rather than a network object)

renamed to network_address.
did the same for the broadcast_address.

    4. "strict" parameter removed from class signatures, replaced with
    class method for non-strict behaviour

'strict' is gone, just create IPv*Interface objects or use the
ip_interface API instead. Network objects are always strict.

    5. Factory functions renamed so they don't look like class names
    (ip_network, ip_address, ip)

Now ip_address, ip_network, ip_interface

    6. "strict" parameter on factory functions modified to default to True
    rather than False

'strict' is gone. Interfaces allow a host IP, Networks don't.

    7. Addition of an explicit "IPInterface" class to cover the
    association of an address with a specific network that is currently
    handled by storing arbitrary addresses on IP network objects


So with a cleanup of the docstrings (and creation of some ReST docs
based on them) a definite +1 from me for inclusion of ipaddr (based on
the 3144 branch in SVN) in 3.3. (with the tweaks to the API, we may
want to use a different name like "ipaddress" or "iptools", though -
otherwise people could be legitimately confused by the differences
relative to the PyPI "ipaddr" module)


Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia

More information about the Python-Dev mailing list