@@ -239,7 +239,7 @@ def summarize_address_range(first, last):
239
239
else :
240
240
raise ValueError ('unknown IP version' )
241
241
242
- ip_bits = first ._max_prefixlen
242
+ ip_bits = first .max_prefixlen
243
243
first_int = first ._ip
244
244
last_int = last ._ip
245
245
while first_int <= last_int :
@@ -326,20 +326,20 @@ def collapse_addresses(addresses):
326
326
# split IP addresses and networks
327
327
for ip in addresses :
328
328
if isinstance (ip , _BaseAddress ):
329
- if ips and ips [- 1 ]._version != ip ._version :
329
+ if ips and ips [- 1 ].version != ip .version :
330
330
raise TypeError ("%s and %s are not of the same version" % (
331
331
ip , ips [- 1 ]))
332
332
ips .append (ip )
333
- elif ip ._prefixlen == ip ._max_prefixlen :
334
- if ips and ips [- 1 ]._version != ip ._version :
333
+ elif ip ._prefixlen == ip .max_prefixlen :
334
+ if ips and ips [- 1 ].version != ip .version :
335
335
raise TypeError ("%s and %s are not of the same version" % (
336
336
ip , ips [- 1 ]))
337
337
try :
338
338
ips .append (ip .ip )
339
339
except AttributeError :
340
340
ips .append (ip .network_address )
341
341
else :
342
- if nets and nets [- 1 ]._version != ip ._version :
342
+ if nets and nets [- 1 ].version != ip .version :
343
343
raise TypeError ("%s and %s are not of the same version" % (
344
344
ip , nets [- 1 ]))
345
345
nets .append (ip )
@@ -407,26 +407,21 @@ def reverse_pointer(self):
407
407
"""
408
408
return self ._reverse_pointer ()
409
409
410
- @property
411
- def version (self ):
412
- msg = '%200s has no version specified' % (type (self ),)
413
- raise NotImplementedError (msg )
414
-
415
410
def _check_int_address (self , address ):
416
411
if address < 0 :
417
412
msg = "%d (< 0) is not permitted as an IPv%d address"
418
- raise AddressValueError (msg % (address , self ._version ))
413
+ raise AddressValueError (msg % (address , self .version ))
419
414
if address > self ._ALL_ONES :
420
415
msg = "%d (>= 2**%d) is not permitted as an IPv%d address"
421
- raise AddressValueError (msg % (address , self ._max_prefixlen ,
422
- self ._version ))
416
+ raise AddressValueError (msg % (address , self .max_prefixlen ,
417
+ self .version ))
423
418
424
419
def _check_packed_address (self , address , expected_len ):
425
420
address_len = len (address )
426
421
if address_len != expected_len :
427
422
msg = "%r (len %d != %d) is not permitted as an IPv%d address"
428
423
raise AddressValueError (msg % (address , address_len ,
429
- expected_len , self ._version ))
424
+ expected_len , self .version ))
430
425
431
426
@classmethod
432
427
def _ip_int_from_prefix (cls , prefixlen ):
@@ -455,12 +450,12 @@ def _prefix_from_ip_int(cls, ip_int):
455
450
ValueError: If the input intermingles zeroes & ones
456
451
"""
457
452
trailing_zeroes = _count_righthand_zero_bits (ip_int ,
458
- cls ._max_prefixlen )
459
- prefixlen = cls ._max_prefixlen - trailing_zeroes
453
+ cls .max_prefixlen )
454
+ prefixlen = cls .max_prefixlen - trailing_zeroes
460
455
leading_ones = ip_int >> trailing_zeroes
461
456
all_ones = (1 << prefixlen ) - 1
462
457
if leading_ones != all_ones :
463
- byteslen = cls ._max_prefixlen // 8
458
+ byteslen = cls .max_prefixlen // 8
464
459
details = ip_int .to_bytes (byteslen , 'big' )
465
460
msg = 'Netmask pattern %r mixes zeroes & ones'
466
461
raise ValueError (msg % details )
@@ -492,7 +487,7 @@ def _prefix_from_prefix_string(cls, prefixlen_str):
492
487
prefixlen = int (prefixlen_str )
493
488
except ValueError :
494
489
cls ._report_invalid_netmask (prefixlen_str )
495
- if not (0 <= prefixlen <= cls ._max_prefixlen ):
490
+ if not (0 <= prefixlen <= cls .max_prefixlen ):
496
491
cls ._report_invalid_netmask (prefixlen_str )
497
492
return prefixlen
498
493
@@ -542,7 +537,7 @@ def _split_addr_prefix(cls, address):
542
537
"""
543
538
# a packed address or integer
544
539
if isinstance (address , (bytes , int )):
545
- return address , cls ._max_prefixlen
540
+ return address , cls .max_prefixlen
546
541
547
542
if not isinstance (address , tuple ):
548
543
# Assume input argument to be string or any object representation
@@ -552,7 +547,7 @@ def _split_addr_prefix(cls, address):
552
547
# Constructing from a tuple (addr, [mask])
553
548
if len (address ) > 1 :
554
549
return address
555
- return address [0 ], cls ._max_prefixlen
550
+ return address [0 ], cls .max_prefixlen
556
551
557
552
def __reduce__ (self ):
558
553
return self .__class__ , (str (self ),)
@@ -577,14 +572,14 @@ def __int__(self):
577
572
def __eq__ (self , other ):
578
573
try :
579
574
return (self ._ip == other ._ip
580
- and self ._version == other ._version )
575
+ and self .version == other .version )
581
576
except AttributeError :
582
577
return NotImplemented
583
578
584
579
def __lt__ (self , other ):
585
580
if not isinstance (other , _BaseAddress ):
586
581
return NotImplemented
587
- if self ._version != other ._version :
582
+ if self .version != other .version :
588
583
raise TypeError ('%s and %s are not of the same version' % (
589
584
self , other ))
590
585
if self ._ip != other ._ip :
@@ -613,7 +608,7 @@ def __hash__(self):
613
608
return hash (hex (int (self ._ip )))
614
609
615
610
def _get_address_key (self ):
616
- return (self ._version , self )
611
+ return (self .version , self )
617
612
618
613
def __reduce__ (self ):
619
614
return self .__class__ , (self ._ip ,)
@@ -649,15 +644,15 @@ def __format__(self, fmt):
649
644
650
645
# Set some defaults
651
646
if fmt_base == 'n' :
652
- if self ._version == 4 :
647
+ if self .version == 4 :
653
648
fmt_base = 'b' # Binary is default for ipv4
654
649
else :
655
650
fmt_base = 'x' # Hex is default for ipv6
656
651
657
652
if fmt_base == 'b' :
658
- padlen = self ._max_prefixlen
653
+ padlen = self .max_prefixlen
659
654
else :
660
- padlen = self ._max_prefixlen // 4
655
+ padlen = self .max_prefixlen // 4
661
656
662
657
if grouping :
663
658
padlen += padlen // 4 - 1
@@ -716,7 +711,7 @@ def __getitem__(self, n):
716
711
def __lt__ (self , other ):
717
712
if not isinstance (other , _BaseNetwork ):
718
713
return NotImplemented
719
- if self ._version != other ._version :
714
+ if self .version != other .version :
720
715
raise TypeError ('%s and %s are not of the same version' % (
721
716
self , other ))
722
717
if self .network_address != other .network_address :
@@ -727,7 +722,7 @@ def __lt__(self, other):
727
722
728
723
def __eq__ (self , other ):
729
724
try :
730
- return (self ._version == other ._version and
725
+ return (self .version == other .version and
731
726
self .network_address == other .network_address and
732
727
int (self .netmask ) == int (other .netmask ))
733
728
except AttributeError :
@@ -738,7 +733,7 @@ def __hash__(self):
738
733
739
734
def __contains__ (self , other ):
740
735
# always false if one is v4 and the other is v6.
741
- if self ._version != other ._version :
736
+ if self .version != other .version :
742
737
return False
743
738
# dealing with another network.
744
739
if isinstance (other , _BaseNetwork ):
@@ -829,7 +824,7 @@ def address_exclude(self, other):
829
824
ValueError: If other is not completely contained by self.
830
825
831
826
"""
832
- if not self ._version == other ._version :
827
+ if not self .version == other .version :
833
828
raise TypeError ("%s and %s are not of the same version" % (
834
829
self , other ))
835
830
@@ -901,10 +896,10 @@ def compare_networks(self, other):
901
896
902
897
"""
903
898
# does this need to raise a ValueError?
904
- if self ._version != other ._version :
899
+ if self .version != other .version :
905
900
raise TypeError ('%s and %s are not of the same type' % (
906
901
self , other ))
907
- # self._version == other._version below here:
902
+ # self.version == other.version below here:
908
903
if self .network_address < other .network_address :
909
904
return - 1
910
905
if self .network_address > other .network_address :
@@ -924,7 +919,7 @@ def _get_networks_key(self):
924
919
and list.sort().
925
920
926
921
"""
927
- return (self ._version , self .network_address , self .netmask )
922
+ return (self .version , self .network_address , self .netmask )
928
923
929
924
def subnets (self , prefixlen_diff = 1 , new_prefix = None ):
930
925
"""The subnets which join to make the current subnet.
@@ -952,7 +947,7 @@ def subnets(self, prefixlen_diff=1, new_prefix=None):
952
947
number means a larger network)
953
948
954
949
"""
955
- if self ._prefixlen == self ._max_prefixlen :
950
+ if self ._prefixlen == self .max_prefixlen :
956
951
yield self
957
952
return
958
953
@@ -967,7 +962,7 @@ def subnets(self, prefixlen_diff=1, new_prefix=None):
967
962
raise ValueError ('prefix length diff must be > 0' )
968
963
new_prefixlen = self ._prefixlen + prefixlen_diff
969
964
970
- if new_prefixlen > self ._max_prefixlen :
965
+ if new_prefixlen > self .max_prefixlen :
971
966
raise ValueError (
972
967
'prefix length diff %d is invalid for netblock %s' % (
973
968
new_prefixlen , self ))
@@ -1036,7 +1031,7 @@ def is_multicast(self):
1036
1031
def _is_subnet_of (a , b ):
1037
1032
try :
1038
1033
# Always false if one is v4 and the other is v6.
1039
- if a ._version != b ._version :
1034
+ if a .version != b .version :
1040
1035
raise TypeError (f"{ a } and { b } are not of the same version" )
1041
1036
return (b .network_address <= a .network_address and
1042
1037
b .broadcast_address >= a .broadcast_address )
@@ -1146,11 +1141,11 @@ class _BaseV4:
1146
1141
"""
1147
1142
1148
1143
__slots__ = ()
1149
- _version = 4
1144
+ version = 4
1150
1145
# Equivalent to 255.255.255.255 or 32 bits of 1's.
1151
1146
_ALL_ONES = (2 ** IPV4LENGTH ) - 1
1152
1147
1153
- _max_prefixlen = IPV4LENGTH
1148
+ max_prefixlen = IPV4LENGTH
1154
1149
# There are only a handful of valid v4 netmasks, so we cache them all
1155
1150
# when constructed (see _make_netmask()).
1156
1151
_netmask_cache = {}
@@ -1170,7 +1165,7 @@ def _make_netmask(cls, arg):
1170
1165
if arg not in cls ._netmask_cache :
1171
1166
if isinstance (arg , int ):
1172
1167
prefixlen = arg
1173
- if not (0 <= prefixlen <= cls ._max_prefixlen ):
1168
+ if not (0 <= prefixlen <= cls .max_prefixlen ):
1174
1169
cls ._report_invalid_netmask (prefixlen )
1175
1170
else :
1176
1171
try :
@@ -1268,15 +1263,6 @@ def _reverse_pointer(self):
1268
1263
reverse_octets = str (self ).split ('.' )[::- 1 ]
1269
1264
return '.' .join (reverse_octets ) + '.in-addr.arpa'
1270
1265
1271
- @property
1272
- def max_prefixlen (self ):
1273
- return self ._max_prefixlen
1274
-
1275
- @property
1276
- def version (self ):
1277
- return self ._version
1278
-
1279
-
1280
1266
class IPv4Address (_BaseV4 , _BaseAddress ):
1281
1267
1282
1268
"""Represent and manipulate single IPv4 Addresses."""
@@ -1556,9 +1542,9 @@ def __init__(self, address, strict=True):
1556
1542
self .network_address = IPv4Address (packed &
1557
1543
int (self .netmask ))
1558
1544
1559
- if self ._prefixlen == (self ._max_prefixlen - 1 ):
1545
+ if self ._prefixlen == (self .max_prefixlen - 1 ):
1560
1546
self .hosts = self .__iter__
1561
- elif self ._prefixlen == (self ._max_prefixlen ):
1547
+ elif self ._prefixlen == (self .max_prefixlen ):
1562
1548
self .hosts = lambda : [IPv4Address (addr )]
1563
1549
1564
1550
@property
@@ -1628,11 +1614,11 @@ class _BaseV6:
1628
1614
"""
1629
1615
1630
1616
__slots__ = ()
1631
- _version = 6
1617
+ version = 6
1632
1618
_ALL_ONES = (2 ** IPV6LENGTH ) - 1
1633
1619
_HEXTET_COUNT = 8
1634
1620
_HEX_DIGITS = frozenset ('0123456789ABCDEFabcdef' )
1635
- _max_prefixlen = IPV6LENGTH
1621
+ max_prefixlen = IPV6LENGTH
1636
1622
1637
1623
# There are only a bunch of valid v6 netmasks, so we cache them all
1638
1624
# when constructed (see _make_netmask()).
@@ -1650,7 +1636,7 @@ def _make_netmask(cls, arg):
1650
1636
if arg not in cls ._netmask_cache :
1651
1637
if isinstance (arg , int ):
1652
1638
prefixlen = arg
1653
- if not (0 <= prefixlen <= cls ._max_prefixlen ):
1639
+ if not (0 <= prefixlen <= cls .max_prefixlen ):
1654
1640
cls ._report_invalid_netmask (prefixlen )
1655
1641
else :
1656
1642
prefixlen = cls ._prefix_from_prefix_string (arg )
@@ -1912,15 +1898,6 @@ def _split_scope_id(ip_str):
1912
1898
raise AddressValueError ('Invalid IPv6 address: "%r"' % ip_str )
1913
1899
return addr , scope_id
1914
1900
1915
- @property
1916
- def max_prefixlen (self ):
1917
- return self ._max_prefixlen
1918
-
1919
- @property
1920
- def version (self ):
1921
- return self ._version
1922
-
1923
-
1924
1901
class IPv6Address (_BaseV6 , _BaseAddress ):
1925
1902
1926
1903
"""Represent and manipulate single IPv6 Addresses."""
@@ -2332,9 +2309,9 @@ def __init__(self, address, strict=True):
2332
2309
self .network_address = IPv6Address (packed &
2333
2310
int (self .netmask ))
2334
2311
2335
- if self ._prefixlen == (self ._max_prefixlen - 1 ):
2312
+ if self ._prefixlen == (self .max_prefixlen - 1 ):
2336
2313
self .hosts = self .__iter__
2337
- elif self ._prefixlen == self ._max_prefixlen :
2314
+ elif self ._prefixlen == self .max_prefixlen :
2338
2315
self .hosts = lambda : [IPv6Address (addr )]
2339
2316
2340
2317
def hosts (self ):
0 commit comments