(cls, ip_str)
Turn an IPv6 ip_str into an integer.

        Args:
            ip_str: A string, the IPv6 ip_str.

        Returns:
            An int, the IPv6 address

        Raises:
            AddressValueError: if ip_str isn't a valid IPv6 Address.
Turn an IPv6 ip_str into an integer.
Turn an IPv6 ip_str into an integer .
def _ip_int_from_string(cls, ip_str):
        """Turn an IPv6 ip_str into an integer.

        Args:
            ip_str: A string, the IPv6 ip_str.

        Returns:
            An int, the IPv6 address

        Raises:
            AddressValueError: if ip_str isn't a valid IPv6 Address.

        """
        if not ip_str:
            raise AddressValueError('Address cannot be empty')

        parts = ip_str.split(':')

        # An IPv6 address needs at least 2 colons (3 parts).
        _min_parts = 3
        if len(parts) < _min_parts:
            msg = "At least %d parts expected in %r" % (_min_parts, ip_str)
            raise AddressValueError(msg)

        # If the address has an IPv4-style suffix, convert it to hexadecimal.
        if '.' in parts[-1]:
            try:
                ipv4_int = IPv4Address(parts.pop())._ip
            except AddressValueError as exc:
                raise AddressValueError("%s in %r" % (exc, ip_str))
            parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF))
            parts.append('%x' % (ipv4_int & 0xFFFF))

        # An IPv6 address can't have more than 8 colons (9 parts).
        # The extra colon comes from using the "::" notation for a single
        # leading or trailing zero part.
        _max_parts = cls._HEXTET_COUNT + 1
        if len(parts) > _max_parts:
            msg = "At most %d colons permitted in %r" % (
                _max_parts - 1, ip_str)
            raise AddressValueError(msg)

        # Disregarding the endpoints, find '::' with nothing in between.
        # This indicates that a run of zeroes has been skipped.
        skip_index = None
        for i in _compat_range(1, len(parts) - 1):
            if not parts[i]:
                if skip_index is not None:
                    # Can't have more than one '::'
                    msg = "At most one '::' permitted in %r" % ip_str
                    raise AddressValueError(msg)
                skip_index = i

        # parts_hi is the number of parts to copy from above/before the '::'
        # parts_lo is the number of parts to copy from below/after the '::'
        if skip_index is not None:
            # If we found a '::', then check if it also covers the endpoints.
            parts_hi = skip_index
            parts_lo = len(parts) - skip_index - 1
            if not parts[0]:
                parts_hi -= 1
                if parts_hi:
                    msg = "Leading ':' only permitted as part of '::' in %r"
                    raise AddressValueError(msg % ip_str)  # ^: requires ^::
            if not parts[-1]:
                parts_lo -= 1
                if parts_lo:
                    msg = "Trailing ':' only permitted as part of '::' in %r"
                    raise AddressValueError(msg % ip_str)  # :$ requires ::$
            parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo)
            if parts_skipped < 1:
                msg = "Expected at most %d other parts with '::' in %r"
                raise AddressValueError(msg % (cls._HEXTET_COUNT - 1, ip_str))
        else:
            # Otherwise, allocate the entire address to parts_hi.  The
            # endpoints could still be empty, but _parse_hextet() will check
            # for that.
            if len(parts) != cls._HEXTET_COUNT:
                msg = "Exactly %d parts expected without '::' in %r"
                raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str))
            if not parts[0]:
                msg = "Leading ':' only permitted as part of '::' in %r"
                raise AddressValueError(msg % ip_str)  # ^: requires ^::
            if not parts[-1]:
                msg = "Trailing ':' only permitted as part of '::' in %r"
                raise AddressValueError(msg % ip_str)  # :$ requires ::$
            parts_hi = len(parts)
            parts_lo = 0
            parts_skipped = 0

        try:
            # Now, parse the hextets into a 128-bit integer.
            ip_int = 0
            for i in range(parts_hi):
                ip_int <<= 16
                ip_int |= cls._parse_hextet(parts[i])
            ip_int <<= 16 * parts_skipped
            for i in range(-parts_lo, 0):
                ip_int <<= 16
                ip_int |= cls._parse_hextet(parts[i])
            return ip_int
        except ValueError as exc:
            raise AddressValueError("%s in %r" % (exc, ip_str))
def _ip_int_from_string ( cls , ip_str ) : if not ip_str : raise AddressValueError ( 'Address cannot be empty' ) parts = ip_str . split ( ':' ) # An IPv6 address needs at least 2 colons (3 parts). _min_parts = 3 if len ( parts ) < _min_parts : msg = "At least %d parts expected in %r" % ( _min_parts , ip_str ) raise AddressValueError ( msg ) # If the address has an IPv4-style suffix, convert it to hexadecimal. if '.' in parts [ - 1 ] : try : ipv4_int = IPv4Address ( parts . pop ( ) ) . _ip except AddressValueError as exc : raise AddressValueError ( "%s in %r" % ( exc , ip_str ) ) parts . append ( '%x' % ( ( ipv4_int >> 16 ) & 0xFFFF ) ) parts . append ( '%x' % ( ipv4_int & 0xFFFF ) ) # An IPv6 address can't have more than 8 colons (9 parts). # The extra colon comes from using the "::" notation for a single # leading or trailing zero part. _max_parts = cls . _HEXTET_COUNT + 1 if len ( parts ) > _max_parts : msg = "At most %d colons permitted in %r" % ( _max_parts - 1 , ip_str ) raise AddressValueError ( msg ) # Disregarding the endpoints, find '::' with nothing in between. # This indicates that a run of zeroes has been skipped. skip_index = None for i in _compat_range ( 1 , len ( parts ) - 1 ) : if not parts [ i ] : if skip_index is not None : # Can't have more than one '::' msg = "At most one '::' permitted in %r" % ip_str raise AddressValueError ( msg ) skip_index = i # parts_hi is the number of parts to copy from above/before the '::' # parts_lo is the number of parts to copy from below/after the '::' if skip_index is not None : # If we found a '::', then check if it also covers the endpoints. parts_hi = skip_index parts_lo = len ( parts ) - skip_index - 1 if not parts [ 0 ] : parts_hi -= 1 if parts_hi : msg = "Leading ':' only permitted as part of '::' in %r" raise AddressValueError ( msg % ip_str ) # ^: requires ^:: if not parts [ - 1 ] : parts_lo -= 1 if parts_lo : msg = "Trailing ':' only permitted as part of '::' in %r" raise AddressValueError ( msg % ip_str ) # :$ requires ::$ parts_skipped = cls . _HEXTET_COUNT - ( parts_hi + parts_lo ) if parts_skipped < 1 : msg = "Expected at most %d other parts with '::' in %r" raise AddressValueError ( msg % ( cls . _HEXTET_COUNT - 1 , ip_str ) ) else : # Otherwise, allocate the entire address to parts_hi.  The # endpoints could still be empty, but _parse_hextet() will check # for that. if len ( parts ) != cls . _HEXTET_COUNT : msg = "Exactly %d parts expected without '::' in %r" raise AddressValueError ( msg % ( cls . _HEXTET_COUNT , ip_str ) ) if not parts [ 0 ] : msg = "Leading ':' only permitted as part of '::' in %r" raise AddressValueError ( msg % ip_str ) # ^: requires ^:: if not parts [ - 1 ] : msg = "Trailing ':' only permitted as part of '::' in %r" raise AddressValueError ( msg % ip_str ) # :$ requires ::$ parts_hi = len ( parts ) parts_lo = 0 parts_skipped = 0 try : # Now, parse the hextets into a 128-bit integer. ip_int = 0 for i in range ( parts_hi ) : ip_int <<= 16 ip_int |= cls . _parse_hextet ( parts [ i ] ) ip_int <<= 16 * parts_skipped for i in range ( - parts_lo , 0 ) : ip_int <<= 16 ip_int |= cls . _parse_hextet ( parts [ i ] ) return ip_int except ValueError as exc : raise AddressValueError ( "%s in %r" % ( exc , ip_str ) )