code: def getDeviceIterator(self, skip_on_error=False):
          
          device_p_p = libusb1.libusb_device_p_p()
          libusb_device_p = libusb1.libusb_device_p
          device_list_len = libusb1.libusb_get_device_list(self.__context_p,
                                                           byref(device_p_p))
          mayRaiseUSBError(device_list_len)
          try:
              for device_p in device_p_p[:device_list_len]:
                  try:
                      # Instanciate our own libusb_device_p object so we can free
                      # libusb-provided device list. Is this a bug in ctypes that
                      # it doesn't copy pointer value (=pointed memory address) ?
                      # At least, it's not so convenient and forces using such
                      # weird code.
                      device = USBDevice(self, libusb_device_p(device_p.contents))
                  except USBError:
                      if not skip_on_error:
                          raise
                  else:
                      self.__close_set.add(device)
                      yield device
          finally:
              libusb1.libusb_free_device_list(device_p_p, 1)
docs: Return an iterator over all USB devices currently plugged in, as USBDevice
          instances.
  
          skip_on_error (bool)
              If True, ignore devices which raise USBError.