skip to navigation
skip to content

Not Logged In

IPy 0.75

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

Latest Version: 0.81

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

Website: https://github.com/haypo/python-ipy/

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('127.0.0.0/30')
>>> for x in ip:
...  print(x)
...
127.0.0.0
127.0.0.1
127.0.0.2
127.0.0.3
>>> ip2 = IP('0x7f000000/30')
>>> ip == ip2
1
>>> ip.reverseNames()
['0.0.0.127.in-addr.arpa.', '1.0.0.127.in-addr.arpa.', '2.0.0.127.in-addr.arpa.', '3.0.0.127.in-addr.arpa.']
>>> ip.reverseName()
'0-3.0.0.127.in-addr.arpa.'
>>> ip.iptype()
'PRIVATE'

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('10.0.0.0/8').version()
4
>>> IP('::1').version()
6

IPv4 addresses

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

IPv6 addresses

>>> print(IP('1080:0:0:0:8:800:200C:417A'))
1080::8:800:200c:417a
>>> print(IP('1080::8:800:200C:417A'))
1080::8:800:200c:417a
>>> print(IP('::1'))
::1
>>> print(IP('::13.1.68.3'))
::d01:4403

Network mask and prefixes

>>> print(IP('127.0.0.0/8'))
127.0.0.0/8
>>> print(IP('127.0.0.0/255.0.0.0'))
127.0.0.0/8
>>> print(IP('127.0.0.0-127.255.255.255'))
127.0.0.0/8

Derive network address

IPy can transform an IP address into a network address by applying the given netmask: >>> print(IP('127.0.0.1/255.0.0.0', make_net=True)) 127.0.0.0/8

This can also be done for existing IP instances: >>> print(IP('127.0.0.1').make_net('255.0.0.0')) 127.0.0.0/8

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   1.2.3.0
wantprefixlen == 1            /prefix                 1.2.3.0/24
wantprefixlen == 2            /netmask                1.2.3.0/255.255.255.0
wantprefixlen == 3            -lastip                 1.2.3.0-1.2.3.255

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

  • NoPrefixForSingleIp
  • WantPrefixLen

Examples of string conversions:

>>> IP('10.0.0.0/32').strNormal()
'10.0.0.0'
>>> IP('10.0.0.0/24').strNormal()
'10.0.0.0/24'
>>> IP('10.0.0.0/24').strNormal(0)
'10.0.0.0'
>>> IP('10.0.0.0/24').strNormal(1)
'10.0.0.0/24'
>>> IP('10.0.0.0/24').strNormal(2)
'10.0.0.0/255.255.255.0'
>>> IP('10.0.0.0/24').strNormal(3)
'10.0.0.0-10.0.0.255'
>>> ip = IP('10.0.0.0')
>>> print(ip)
10.0.0.0
>>> ip.NoPrefixForSingleIp = None
>>> print(ip)
10.0.0.0/32
>>> ip.WantPrefixLen = 3
>>> print(ip)
10.0.0.0-10.0.0.0

TODO

  • 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.75 (2011-04-12)

  • IP('::/0').netmask() gives IP('::') instead of IP('0.0.0.0')

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('0.0.0.0/0') + IP('0.0.0.0/0') raises an error, fix written by Arfrever

Version 0.73 (2011-02-15)

  • Support Python 3: setup.py 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 MANIFEST.in in source build (add them to MANIFEST.in)
  • 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
  • 223.0.0.0/8 is now public (belongs to APNIC)

Version 0.70 (2009-10-29)

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

Version 0.64 (2009-08-19)

  • Create MANIFEST.in to fix setup.py bdist_rpm, fix by Robert Nickel

Version 0.63 (2009-06-23)

  • Fix formatting of "IPv4 in IPv6" network, eg. IP('::ffff:192.168.10.0/120'), the netmask ("/120" in the example) was missing!

Version 0.62 (2008-07-15)

  • Fix reverse DNS of IPv6 address: use ".ip6.arpa." suffix instead of deprecated ".ip6.int." 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
 
File Type Py Version Uploaded on Size
IPy-0.75.tar.gz (md5) Source 2011-04-12 27KB
  • Downloads (All Versions):
  • 567 downloads in the last day
  • 3226 downloads in the last week
  • 12732 downloads in the last month