mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Issue #23133: Pickling of ipaddress objects now produces more compact and
portable representation.
This commit is contained in:
parent
3b225d8bfb
commit
5f38f5c502
3 changed files with 41 additions and 14 deletions
|
@ -567,6 +567,9 @@ class _IPAddressBase(_TotalOrderingMixin):
|
|||
except ValueError:
|
||||
cls._report_invalid_netmask(ip_str)
|
||||
|
||||
def __reduce__(self):
|
||||
return self.__class__, (str(self),)
|
||||
|
||||
|
||||
class _BaseAddress(_IPAddressBase):
|
||||
|
||||
|
@ -576,11 +579,6 @@ class _BaseAddress(_IPAddressBase):
|
|||
used by single IP addresses.
|
||||
"""
|
||||
|
||||
def __init__(self, address):
|
||||
if (not isinstance(address, bytes)
|
||||
and '/' in str(address)):
|
||||
raise AddressValueError("Unexpected '/' in %r" % address)
|
||||
|
||||
def __int__(self):
|
||||
return self._ip
|
||||
|
||||
|
@ -626,6 +624,9 @@ class _BaseAddress(_IPAddressBase):
|
|||
def _get_address_key(self):
|
||||
return (self._version, self)
|
||||
|
||||
def __reduce__(self):
|
||||
return self.__class__, (self._ip,)
|
||||
|
||||
|
||||
class _BaseNetwork(_IPAddressBase):
|
||||
|
||||
|
@ -1295,7 +1296,6 @@ class IPv4Address(_BaseV4, _BaseAddress):
|
|||
AddressValueError: If ipaddress isn't a valid IPv4 address.
|
||||
|
||||
"""
|
||||
_BaseAddress.__init__(self, address)
|
||||
_BaseV4.__init__(self, address)
|
||||
|
||||
# Efficient constructor from integer.
|
||||
|
@ -1313,6 +1313,8 @@ class IPv4Address(_BaseV4, _BaseAddress):
|
|||
# Assume input argument to be string or any object representation
|
||||
# which converts into a formatted IP string.
|
||||
addr_str = str(address)
|
||||
if '/' in addr_str:
|
||||
raise AddressValueError("Unexpected '/' in %r" % address)
|
||||
self._ip = self._ip_int_from_string(addr_str)
|
||||
|
||||
@property
|
||||
|
@ -1446,6 +1448,8 @@ class IPv4Interface(IPv4Address):
|
|||
def __hash__(self):
|
||||
return self._ip ^ self._prefixlen ^ int(self.network.network_address)
|
||||
|
||||
__reduce__ = _IPAddressBase.__reduce__
|
||||
|
||||
@property
|
||||
def ip(self):
|
||||
return IPv4Address(self._ip)
|
||||
|
@ -1920,7 +1924,6 @@ class IPv6Address(_BaseV6, _BaseAddress):
|
|||
AddressValueError: If address isn't a valid IPv6 address.
|
||||
|
||||
"""
|
||||
_BaseAddress.__init__(self, address)
|
||||
_BaseV6.__init__(self, address)
|
||||
|
||||
# Efficient constructor from integer.
|
||||
|
@ -1938,6 +1941,8 @@ class IPv6Address(_BaseV6, _BaseAddress):
|
|||
# Assume input argument to be string or any object representation
|
||||
# which converts into a formatted IP string.
|
||||
addr_str = str(address)
|
||||
if '/' in addr_str:
|
||||
raise AddressValueError("Unexpected '/' in %r" % address)
|
||||
self._ip = self._ip_int_from_string(addr_str)
|
||||
|
||||
@property
|
||||
|
@ -2134,6 +2139,8 @@ class IPv6Interface(IPv6Address):
|
|||
def __hash__(self):
|
||||
return self._ip ^ self._prefixlen ^ int(self.network.network_address)
|
||||
|
||||
__reduce__ = _IPAddressBase.__reduce__
|
||||
|
||||
@property
|
||||
def ip(self):
|
||||
return IPv6Address(self._ip)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue