2014-03-01 2 views
2

Следующий фрагмент от pyusb tutuorial. Он используется, чтобы найти все принтеры, подключенные:Что происходит в этом коде Python?

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, пожалуйста, скажите мне, как.

+0

Что такое downvote? –

+0

+1 :) выглядит довольно ясно для меня –

ответ

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))

Потому что кто-то имел thinko. Последняя часть должна быть ...=find_class(7).

+0

Спасибо! Любая идея о множественном возврате? –

+0

Что с ними? Вы можете использовать 'return' столько раз, сколько хотите. –

+0

Ну, о возвратах, код, кажется, возвращает логическое значение в нескольких точках и затем в конечном итоге возвращает 'False'. Не возвращает ли последнее «ложное» отрицание другого? –

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 find_class(object): 
    def __init__(self, class_nr): 
     self.class_nr = class_nr 

Кроме того, я не мог понять, как этот код ищет все принтеры, подключенные к системе.

Как указано в уроке, usb.core.find() возвращает первое найденное устройство, если вы не передадите истинное значение аргументу find_all. - Это не код, который вы видите, который ищет все устройства, это usb.core.find(), который делает. - Он также отвечает на следующий вопрос:

Есть device список/кортеж?

No.

Этот класс, кажется, есть несколько точек, где она возвращает логическое значение. Сколько отправлений отправляется?

Вызывается __call__() для каждого устройства. usb.core.find() находит. Устройство передается в device. __call__() вернется только один раз для каждого вызова (очевидно). Сколько раз он называется, зависит от устройств, найденных в системе.

Петля, которую вы найдете, есть только для одного устройства! Пользовательский поиск счастлив (в этом случае), если устройство является классом 7 или, любая его конфигурация имеет интерфейс с классом 7.

Смежные вопросы