for a 'good python'

Barry barry at barrys-emacs.org
Thu Apr 13 11:00:59 EDT 2023




> On 13 Apr 2023, at 00:19, jak <nospam at please.ty> wrote:
> 
> 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.

Ipaddress was developed outside of the std lib and later added i recall.

Barry
> 
> -- 
> https://mail.python.org/mailman/listinfo/python-list



More information about the Python-list mailing list