docs: def from_bytes(self, raw):
          '''Return an Ethernet object reconstructed from raw bytes, or an
             Exception if we can't resurrect the packet.'''
          if len(raw) < Arp._MINLEN:
              raise NotEnoughDataError("Not enough bytes ({}) to reconstruct an Arp object".format(len(raw)))
          fields = struct.unpack(Arp._PACKFMT, raw[:Arp._MINLEN])
          try:
              self._hwtype = ArpHwType(fields[0])
              self._prototype = EtherType(fields[1])
              self._hwaddrlen = fields[2]
              self._protoaddrlen = fields[3]
              self.operation = ArpOperation(fields[4])
              self.senderhwaddr = EthAddr(fields[5])
              self.senderprotoaddr = IPAddr(fields[6])
              self.targethwaddr = EthAddr(fields[7])
              self.targetprotoaddr = IPAddr(fields[8])
          except Exception as e:
              raise Exception("Error constructing Arp packet object from raw bytes: {}".format(str(e)))
          return raw[Arp._MINLEN:]