New submission from Thomas Cellerier <thomasceller...@gmail.com>:

`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                                 Traceback (most recent call 
last)
        <ipython-input-7-7fc0bff07012> in <module>
        ----> 1 ipaddress.ip_network(("192.168.100.0", "fooo"))

        /usr/lib/python3.8/ipaddress.py in ip_network(address, strict)
             81         pass
             82
        ---> 83     raise ValueError('%r does not appear to be an IPv4 or IPv6 
network' %
             84                      address)
             85

        TypeError: not all arguments converted during string formatting

Compared to:

        In [8]: ipaddress.IPv4Network(("192.168.100.0", "foo"))
        
---------------------------------------------------------------------------
        NetmaskValueError                         Traceback (most recent call 
last)
        <ipython-input-8-79078758e653> in <module>
        ----> 1 ipaddress.IPv4Network(("192.168.100.0", "foo"))

        /usr/lib/python3.8/ipaddress.py in __init__(self, address, strict)
           1453
           1454         self.network_address = IPv4Address(addr)
        -> 1455         self.netmask, self._prefixlen = self._make_netmask(mask)
           1456         packed = int(self.network_address)
           1457         if packed & int(self.netmask) != packed:

        /usr/lib/python3.8/ipaddress.py in _make_netmask(cls, arg)
           1118                     # Check for a netmask or hostmask in 
dotted-quad form.
           1119                     # This may raise NetmaskValueError.
        -> 1120                     prefixlen = cls._prefix_from_ip_string(arg)
           1121             netmask = 
IPv4Address(cls._ip_int_from_prefix(prefixlen))
           1122             cls._netmask_cache[arg] = netmask, prefixlen

        /usr/lib/python3.8/ipaddress.py in _prefix_from_ip_string(cls, ip_str)
            516             ip_int = cls._ip_int_from_string(ip_str)
            517         except AddressValueError:
        --> 518             cls._report_invalid_netmask(ip_str)
            519
            520         # Try matching a netmask (this would be /1*0*/ as a 
bitwise regexp).

        /usr/lib/python3.8/ipaddress.py in _report_invalid_netmask(cls, 
netmask_str)
            472     def _report_invalid_netmask(cls, netmask_str):
            473         msg = '%r is not a valid netmask' % netmask_str
        --> 474         raise NetmaskValueError(msg) from None
            475
            476     @classmethod

        NetmaskValueError: 'foo' is not a valid netmask

----------
components: Library (Lib)
messages: 410798
nosy: thomascellerier
priority: normal
severity: normal
status: open
title: ipaddress.ip_{address,network,interface} raise TypeError instead of 
ValueError if given a tuple as address
type: behavior
versions: Python 3.8

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue46415>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to