mirror of
https://github.com/python/cpython
synced 2024-09-05 00:05:39 +00:00
bpo-46415: Use f-string for ValueError in ipaddress.ip_{address,network,interface} helper functions (#30642)
`IPv*Network` and `IPv*Interface` constructors accept a 2-tuple of (address description, netmask) as the address parameter. When the tuple-based address is used errors are not propagated correctly through the `ipaddress.ip_*` helper because of the %-formatting now expecting several arguments: In [7]: ipaddress.ip_network(("192.168.100.0", "fooo")) ... TypeError: not all arguments converted during string formatting Compared to: In [8]: ipaddress.IPv4Network(("192.168.100.0", "foo")) ... NetmaskValueError: 'foo' is not a valid netmask Use an f-string to make sure the error is always properly formatted. Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
This commit is contained in:
parent
ec8d3adb99
commit
52dc9c3066
|
@ -51,8 +51,7 @@ def ip_address(address):
|
|||
except (AddressValueError, NetmaskValueError):
|
||||
pass
|
||||
|
||||
raise ValueError('%r does not appear to be an IPv4 or IPv6 address' %
|
||||
address)
|
||||
raise ValueError(f'{address!r} does not appear to be an IPv4 or IPv6 address')
|
||||
|
||||
|
||||
def ip_network(address, strict=True):
|
||||
|
@ -81,8 +80,7 @@ def ip_network(address, strict=True):
|
|||
except (AddressValueError, NetmaskValueError):
|
||||
pass
|
||||
|
||||
raise ValueError('%r does not appear to be an IPv4 or IPv6 network' %
|
||||
address)
|
||||
raise ValueError(f'{address!r} does not appear to be an IPv4 or IPv6 network')
|
||||
|
||||
|
||||
def ip_interface(address):
|
||||
|
@ -116,8 +114,7 @@ def ip_interface(address):
|
|||
except (AddressValueError, NetmaskValueError):
|
||||
pass
|
||||
|
||||
raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' %
|
||||
address)
|
||||
raise ValueError(f'{address!r} does not appear to be an IPv4 or IPv6 interface')
|
||||
|
||||
|
||||
def v4_int_to_packed(address):
|
||||
|
@ -160,7 +157,7 @@ def _split_optional_netmask(address):
|
|||
"""Helper to split the netmask and raise AddressValueError if needed"""
|
||||
addr = str(address).split('/')
|
||||
if len(addr) > 2:
|
||||
raise AddressValueError("Only one '/' permitted in %r" % address)
|
||||
raise AddressValueError(f"Only one '/' permitted in {address!r}")
|
||||
return addr
|
||||
|
||||
|
||||
|
@ -1304,7 +1301,7 @@ def __init__(self, address):
|
|||
# which converts into a formatted IP string.
|
||||
addr_str = str(address)
|
||||
if '/' in addr_str:
|
||||
raise AddressValueError("Unexpected '/' in %r" % address)
|
||||
raise AddressValueError(f"Unexpected '/' in {address!r}")
|
||||
self._ip = self._ip_int_from_string(addr_str)
|
||||
|
||||
@property
|
||||
|
@ -1913,7 +1910,7 @@ def __init__(self, address):
|
|||
# which converts into a formatted IP string.
|
||||
addr_str = str(address)
|
||||
if '/' in addr_str:
|
||||
raise AddressValueError("Unexpected '/' in %r" % address)
|
||||
raise AddressValueError(f"Unexpected '/' in {address!r}")
|
||||
addr_str, self._scope_id = self._split_scope_id(addr_str)
|
||||
|
||||
self._ip = self._ip_int_from_string(addr_str)
|
||||
|
|
|
@ -1132,6 +1132,14 @@ def testIPv4Tuple(self):
|
|||
self.assertEqual(ipaddress.IPv4Interface((3221225985, 24)),
|
||||
ipaddress.IPv4Interface('192.0.2.1/24'))
|
||||
|
||||
# Invalid netmask
|
||||
with self.assertRaises(ValueError):
|
||||
ipaddress.IPv4Network(('192.0.2.1', '255.255.255.255.0'))
|
||||
|
||||
# Invalid netmask using factory
|
||||
with self.assertRaises(ValueError):
|
||||
ipaddress.ip_network(('192.0.2.1', '255.255.255.255.0'))
|
||||
|
||||
# issue #16531: constructing IPv6Network from an (address, mask) tuple
|
||||
def testIPv6Tuple(self):
|
||||
# /128
|
||||
|
@ -1191,6 +1199,14 @@ def testIPv6Tuple(self):
|
|||
ipaddress.IPv6Network((ip_scoped, 96))
|
||||
# strict=False and host bits set
|
||||
|
||||
# Invalid netmask
|
||||
with self.assertRaises(ValueError):
|
||||
ipaddress.IPv6Network(('2001:db8::1', '255.255.255.0'))
|
||||
|
||||
# Invalid netmask using factory
|
||||
with self.assertRaises(ValueError):
|
||||
ipaddress.ip_network(('2001:db8::1', '255.255.255.0'))
|
||||
|
||||
# issue57
|
||||
def testAddressIntMath(self):
|
||||
self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255,
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Fix ipaddress.ip_{address,interface,network} raising TypeError instead of
|
||||
ValueError if given invalid tuple as address parameter.
|
Loading…
Reference in a new issue