【问题标题】:what is happening in this python code?这个python代码发生了什么?
【发布时间】:2014-03-01 04:20:30
【问题描述】:

以下 sn-p 来自 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/任何usb程序,请告诉我怎么做。

【问题讨论】:

  • 投反对票是为了什么?
  • +1 :) 对我来说很清楚

标签: python return pyusb


【解决方案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)。

【讨论】:

  • 谢谢!关于多重回报的任何想法?
  • 他们呢?您可以多次使用return。
  • 嗯,关于返回,代码似乎在多个点返回一个布尔值,然后最终返回False。最后的False 回报不是否定其他回报吗?
  • 您不能“否定”其他回报。您只返回一次。
  • 一旦到达return 语句,函数将停止执行,控制返回调用堆栈中的前一个点。 return 语句之后出现的内容永远不会运行。
【解决方案2】:

为什么 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 类的接口,则自定义搜索是快乐的(在这种情况下)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 2015-06-22
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多