以下代码段来自pyusb tutuorial。它用于查找所有连接的打印机:
import usb.core
import usb.util
import sys
class find_class(object):
def __init__(self, class_):
self._class = class_
def __call__(self, device):
# first, let's check the device
if device.bDeviceClass == self._class:
return True
# ok, transverse all devices to find an
# interface that matches our class
for cfg in device:
# find_descriptor: what's it?
intf = usb.util.find_descriptor(
cfg,
bInterfaceClass=self._class
)
if intf is not None:
return True
return False
printers = usb.core.find(find_all=1, custom_match=find_all(7))
这个类似乎有多个点,它返回一个布尔值。发送了多少回报?
此外,我无法理解此代码如何搜索连接到系统的所有打印机。 这段代码中逃避我的事情是:
device
是列表/元组吗?如果是,此代码如何通过仅执行一次if device.bDeviceClass == self._class:
来检查所有设备?self._class = class_
为什么类find_class
从未在printers = usb.core.find(find_all=1, custom_match=find_all(7))
如果您已经参与过pyusb / any usb程序,请告诉我如何。
答案 0 :(得分:1)
设备是列表/元组吗?
device
是usb.core.Device
。迭代它yields configurations。
如果是,此代码如何通过执行
if device.bDeviceClass == self._class:
一次检查所有设备?
没有。您错过了部分说“所以,要真正找到连接到系统的所有打印机,我们需要横向所有配置,然后所有接口并检查其中一个接口是否其bInterfaceClass字段等于7。”。
这一行发生了什么:
self._class = class
_
究竟是什么意思。它将该参数中的对象绑定到该属性。供以后使用。
为什么类find_class从未在
中实例化printers = usb.core.find(find_all=1, custom_match=find_all(7))
因为有人有思想。最后一部分应为...=find_class(7)
。
答案 1 :(得分:1)
为什么课程find_class
从未在printers = usb.core.find(find_all=1, custom_match=find_all(7))
在链接到教程的教程中,您会发现这是一个错字。本教程的下一行正确使用custom_match=find_class(7)
。
这一行发生了什么:self._class = class_
在此示例中,它设置self._class = 7
。 (来自行find_class(7)
。)不使用self.class = class
的原因是“class”是一个保留字,会引发语法错误。也许这会更好:
class find_class(object):
def __init__(self, class_nr):
self.class_nr = class_nr
此外,我无法理解此代码如何搜索连接到系统的所有打印机。
如教程中所述,usb.core.find()
返回找到的第一个设备,除非您将true值传递给find_all
参数。 - 这不是您看到的搜索所有设备的代码,它是usb.core.find()
。 - 它还回答了下一个问题:
device
是列表/元组吗?
没有
这个类似乎有多个点,它返回一个布尔值。正在发送多少退货?
为每个设备__call__()
找到usb.core.find()
。设备在device
中传递。 __call__()
每次通话只会返回一次(显然)。它被调用的次数取决于系统中的设备。
您在那里找到的循环仅适用于单个设备!如果设备是7级或,则自定义搜索很高兴(在这种情况下),其中任何一个配置都具有类7的接口。