'Initialize an ip4range class. The constructor accepts an unlimited
number of arguments that may either be tuples in the form (start,stop),
integers, longs or strings, where start and stop in a tuple may
also be of the form integer, long or string.
Passing an integer or long means passing an IPv4-address that\'s already
been converted to integer notation, whereas passing a string specifies
an address where this conversion still has to be done. A string
address may be in the following formats:
- 1.2.3.4    - a plain address, interpreted as a single address
- 1.2.3      - a set of addresses, interpreted as 1.2.3.0-1.2.3.255
- localhost  - hostname to look up, interpreted as single address
- 1.2.3<->5  - a set of addresses, interpreted as 1.2.3.0-1.2.5.255
- 1.2.0.0/16 - a set of addresses, interpreted as 1.2.0.0-1.2.255.255
Only the first three notations are valid if you use a string address in
a tuple, whereby notation 2 is interpreted as 1.2.3.0 if specified as
lower bound and 1.2.3.255 if specified as upper bound, not as a range
of addresses.
Specifying a range is done with the <-> operator. This is necessary
because \'-\' might be present in a hostname. \'<->\' shouldn\'t be, ever.'

def __init__(self, *args):

    if ((len(args) == 1) and isinstance(args[0], IP4Range)):
        super(IP4Range, self).__init__(args[0])
        return
    args = list(args)
    for i in range(len(args)):
        argval = args[i]
        if isinstance(argval, str):
            if ('<->' in argval):
                args[i] = self._parseRange(*argval.split('<->', 1))
                continue
            elif ('/' in argval):
                args[i] = self._parseMask(*argval.split('/', 1))
            else:
                args[i] = self._parseAddrRange(argval)
        elif isinstance(argval, tuple):
            if (len(tuple) != 2):
                raise ValueError('Tuple    is    of    invalid    length.')
            (addr1, addr2) = argval
            if isinstance(addr1, str):
                addr1 = self._parseAddrRange(addr1)[0]
            elif (not isinstance(addr1, six.integer_types)):
                raise TypeError('Invalid    argument.')
            if isinstance(addr2, str):
                addr2 = self._parseAddrRange(addr2)[1]
            elif (not isinstance(addr2, six.integer_types)):
                raise TypeError('Invalid    argument.')
            args[i] = (addr1, addr2)
        elif (not isinstance(argval, six.integer_types)):
            raise TypeError('Invalid    argument.')
    super(IP4Range, self).__init__(min=self._MINIP4, max=self._MAXIP4, *args)
