Skip to main content

Class and tools for handling of IPv4 and IPv6 addresses and networks

Project description

IPy - class and tools for handling of IPv4 and IPv6 addresses and networks.


Presentation of the API

The IP class allows a comfortable parsing and handling for most notations in use for IPv4 and IPv6 addresses and networks. It was greatly inspired by RIPE’s Perl module NET::IP’s interface but doesn’t share the implementation. It doesn’t share non-CIDR netmasks, so funky stuff like a netmask of 0xffffff0f can’t be done here.

>>> from IPy import IP
>>> ip = IP('')
>>> for x in ip:
...  print(x)
>>> ip2 = IP('0x7f000000/30')
>>> ip == ip2
>>> ip.reverseNames()
['', '', '', '']
>>> ip.reverseName()
>>> ip.iptype()

Supports most IP address formats

It can detect about a dozen different ways of expressing IP addresses and networks, parse them and distinguish between IPv4 and IPv6 addresses:

>>> IP('').version()
>>> IP('::1').version()

IPv4 addresses

>>> print(IP(0x7f000001))
>>> print(IP('0x7f000001'))
>>> print(IP(''))
>>> print(IP('10'))

IPv6 addresses

>>> print(IP('1080:0:0:0:8:800:200C:417A'))
>>> print(IP('1080::8:800:200C:417A'))
>>> print(IP('::1'))
>>> print(IP('::'))

Network mask and prefixes

>>> print(IP(''))
>>> print(IP(''))
>>> print(IP(''))

Derive network address

IPy can transform an IP address into a network address by applying the given netmask: >>> print(IP(‘’, make_net=True))

This can also be done for existing IP instances: >>> print(IP(‘’).make_net(‘’))

Convert address to string

Nearly all class methods which return a string have an optional parameter ‘wantprefixlen’ which controls if the prefixlen or netmask is printed. Per default the prefilen is always shown if the network contains more than one address:

wantprefixlen == 0 / None     don't return anything
wantprefixlen == 1            /prefix       
wantprefixlen == 2            /netmask      
wantprefixlen == 3            -lastip       

You can also change the defaults on an per-object basis by fiddling with the class members:

  • NoPrefixForSingleIp
  • WantPrefixLen

Examples of string conversions:

>>> IP('').strNormal()
>>> IP('').strNormal()
>>> IP('').strNormal(0)
>>> IP('').strNormal(1)
>>> IP('').strNormal(2)
>>> IP('').strNormal(3)
>>> ip = IP('')
>>> print(ip)
>>> ip.NoPrefixForSingleIp = None
>>> print(ip)
>>> ip.WantPrefixLen = 3
>>> print(ip)


  • better comparison (__cmp__ and friends)
  • tests for __cmp__
  • always write hex values lowercase
  • interpret 2001:1234:5678:1234/64 as 2001:1234:5678:1234::/64
  • move size in bits into class variables to get rid of some “if self._ipversion …”
  • support for base85 encoding
  • support for output of IPv6 encoded IPv4 Addresses
  • update address type tables
  • first-last notation should be allowed for IPv6
  • add IPv6 docstring examples
  • check better for negative parameters
  • add addition / aggregation
  • move reverse name stuff out of the classes and refactor it
  • support for aggregation of more than two nets at once
  • support for aggregation with “holes”
  • support for finding common prefix
  • ‘>>’ and ‘<<’ for prefix manipulation
  • add our own exceptions instead ValueError all the time
  • rename checkPrefix to checkPrefixOk
  • add more documentation and doctests
  • refactor

What’s new

Version 0.76 (2013-03-19)

  • ip == other and ip != other doesn’t fail with an exception anymore if other is not a IP object
  • Add IP.get_mac() method: get the 802.3 MAC address from IPv6 RFC 2464 address.
  • Fix IP(‘::/0’)[0]: return an IPv6 instead of an IPv4 address

Version 0.75 (2011-04-12)

  • IP(‘::/0’).netmask() gives IP(‘::’) instead of IP(‘’)

Version 0.74 (2011-02-16)

  • Fix tests for Python 3.1 and 3.2
  • ip.__nonzero__() and (ipa in ipb) return a bool instead of 0 or 1
  • IP(‘’) + IP(‘’) raises an error, fix written by Arfrever

Version 0.73 (2011-02-15)

  • Support Python 3: runs 2to3
  • Update the ranges for IPv6 IPs
  • Fix reverseName() and reverseNames() for IPv4 in IPv6 addresses
  • Drop support of Python < 2.5

Version 0.72 (2010-11-23)

  • Include examples and in source build (add them to
  • Remove __rcsid__ constant from IPy module

Version 0.71 (2010-10-01)

  • Use xrange() instead of range()
  • Use isinstance(x, int) instead of type(x) == types.IntType
  • Prepare support of Python3 (use integer division: x // y)
  • Fix IP(long) constructor: ensure that the address is not too large
  • Constructor raise a TypeError if the type is not int, long, str or unicode
  • is now public (belongs to APNIC)

Version 0.70 (2009-10-29)

  • New “major” version because it may break compatibility
  • Fix __cmp__(): IP(‘’) and IP(‘’) are not equal
  • Fix of the network “::/0”: “::” instead of “”. IPy 0.63 should fix this bug, but it wasn’t.

Version 0.64 (2009-08-19)

  • Create to fix bdist_rpm, fix by Robert Nickel

Version 0.63 (2009-06-23)

  • Fix formatting of “IPv4 in IPv6” network, eg. IP(‘::ffff:’), the netmask (“/120” in the example) was missing!

Version 0.62 (2008-07-15)

  • Fix reverse DNS of IPv6 address: use “” suffix instead of deprecated “” suffix

Version 0.61 (2008-06-12)

  • Patch from Aras Vaichas allowing the [-1] operator to work with an IP object of size 1.

Version 0.60 (2008-05-16)

  • strCompressed() formats ‘::ffff:a.b.c.d’ correctly
  • Use strCompressed() instead of strFullsize() to format IP addresses, ouput is smarter with IPv6 address
  • Remove check_addr_prefixlen because it generates invalid IP address

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for IPy, version 0.76
Filename, size File type Python version Upload date Hashes
Filename, size IPy-0.76.tar.gz (29.1 kB) File type Source Python version None Upload date Hashes View

Supported by

Pingdom Pingdom Monitoring Google Google Object Storage and Download Analytics Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page