Closed telmich closed 5 years ago
This is correct behavior. Your two inputs are not equal: In Python 2, string literals are byte strings by default, whereas in Python 3 (as well as many other programming languages), strings literals are character strings by default.
So Python 2's "2001:db8:61::/64"
is really b"2001:db8:61::/64"
, and ipaddress.ip_network(b"2001:db8:61::/64")
is IPv6Network(u'3230:3031:3a64:6238:3a36:313a:3a2f:3634/128')
, both with this backport and in the standard library in Python 3.3+. This is because
>>> ipaddress.ip_address(u'3230:3031:3a64:6238:3a36:313a:3a2f:3634').packed
b'2001:db8:61::/64'
and if you pass in any representation of an address, you get the network with just that address.
To avoid this mistake, make sure to pass in character strings if you want ipaddress to construct from a character representation, for example by using ipaddress.ip_network(u"2001:db8:61::/64")
.
For more information, see the README.
Any other behavior would introduce very dangerous silent incompatibilities when switching between this ipaddress and the standard library one.
Thanks for the (very fast) clarification!
When creating an IPv6Network with python2 / ipaddress-1.0.22, the network representation is screwed up:
Expected result as seen in python3: