这个python代码中发生了什么?

时间:2014-03-01 04:20:31

标签: python return pyusb

以下代码段来自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程序,请告诉我如何。

2 个答案:

答案 0 :(得分:1)

  

设备是列表/元组吗?

deviceusb.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的接口。