for a 'good python'

jak nospam at please.ty
Wed Apr 12 18:21:58 EDT 2023


Barry ha scritto:
> 
> 
> 
>> On 12 Apr 2023, at 18:10, jak <nospam at please.ty> wrote:
>> Hi everyone,
>> some time ago I wrote a class to determine if an ipv4 address belonged
>> to a subnet. Seldom using python I'm pretty sure it's not written in
>> 'good python' nor too portable. Could you give me some advice to make it
>> better?
>>
>> class calcip:
>>     def __init__(self, psubnet: str):
>>         ssubnet, scidr = psubnet.replace(' ', '').split('/')
>>         subnet = int.from_bytes(tuple(
>>                                   map(lambda n: (int(n)), ssubnet.split('.'))),
>>                                 'big')
>>         cidr = int(scidr)
>>         mask = ((2 ** cidr) - 1) << (32 - cidr)
>>         self.__network = subnet & mask
>>         self.__wildcard = ~mask & 0xffffffff
>>         self.__broadcast = (subnet | self.__wildcard) & 0xffffffff
>>         self.__tsubnet = tuple(subnet.to_bytes(4, 'big'))
>>         self.__tnetwork = tuple(self.__network.to_bytes(4, 'big'))
>>         self.__tbroadcast = tuple(self.__broadcast.to_bytes(4, 'big'))
>>         self.__tmask = tuple(mask.to_bytes(4, 'big'))
>>         self.__twildcard = tuple(self.__wildcard.to_bytes(4, 'big'))
>>         self.__host_min = tuple((self.__network + 1).to_bytes(4, 'big'))
>>         self.__host_max = tuple((self.__broadcast - 1).to_bytes(4, 'big'))
>>
>>     @staticmethod
>>     def __to_str(val: tuple):
>>         return '.'.join(str(v) for v in val)
>>
>>     @property
>>     def subnet(self):
>>         return self.__to_str(self.__tsubnet)
>>
>>     @property
>>     def network(self):
>>         return self.__to_str(self.__tnetwork)
>>
>>     @property
>>     def broadcast(self):
>>         return self.__to_str(self.__tbroadcast)
>>
>>     @property
>>     def mask(self):
>>         return self.__to_str(self.__tmask)
>>
>>     @property
>>     def wildcard(self):
>>         return self.__to_str(self.__twildcard)
>>
>>     @property
>>     def host_min(self):
>>         return self.__to_str(self.__host_min)
>>
>>     @property
>>     def host_max(self):
>>         return self.__to_str(self.__host_max)
>>
>>     @property
>>     def hosts_num(self):
>>         return self.__wildcard - 1
>>
>>     @property
>>     def net_class(self):
>>         tst = (self.__tnetwork[0] & 0xf0) >> 4
>>         if (tst & 0x8) == 0:
>>             clx = 'A'
>>         elif (tst & 0xc) == 0x8:
>>             clx = 'B'
>>         elif (tst & 0xe) == 0xc:
>>             clx = 'C'
>>         elif (tst & 0xf) == 0xe:
>>             clx = 'D'
>>         elif (tst & 0xf) == 0xf:
>>             clx = 'E'
>>         return clx
>>
>>     def __contains__(self, item):
>>         ret = True
>>         row_hdr = None
>>         try:
>>             row_hdr = int.from_bytes(tuple(map(lambda n: (int(n)), item.split('.'))), 'big')
>>         except:
>>             ret = False
>>         if ret:
>>             if not self.__network < row_hdr < self.__broadcast:
>>                 ret = False
>>         return ret
>>
>>
>> def main():
>>     sn = calcip('10.0.0.0/26')
>>
>>     print(f"subnet: {sn.subnet}")
>>     print(f"network: {sn.network}")
>>     print(f"broadcast: {sn.broadcast}")
>>     print(f"mask: {sn.mask}")
>>     print(f"wildcard: {sn.wildcard}")
>>     print(f"host_min: {sn.host_min}")
>>     print(f"host_max: {sn.host_max}")
>>     print(f"Avaible hosts: {sn.hosts_num}")
>>     print(f"Class: {sn.net_class}")
>>
>>     tst_hdr = '10.0.0.31'
>>     is_not = 'is '
>>     if not tst_hdr in sn:
>>         is_not = 'is NOT '
>>     print("hdr %s %sin range %s - %s" %
>>           (tst_hdr, is_not, sn.host_min, sn.host_max))
>>
>> if __name__ == '__main__':
>>     main()
> 
> There is this https://docs.python.org/3/howto/ipaddress.html if you just want a solution.
> 
> Or are you after code review feedback?
> 
> Barry
> 
>> -- 
>> https://mail.python.org/mailman/listinfo/python-list


Thank you too. I had seen this library but I always try not to use
libraries outside the standard ones. Now I don't remember why I was
convinced that this wasn't part of it, perhaps because it was like that
at the time or because I got confused. Only now I realized that it is
not necessary to install it. Now I'm considering whether to use
'ipaddress' or 'socket'. What is certain is that this one you have
suggested is really comfortable. Thanks again for the report.



More information about the Python-list mailing list