Разработка для модульности и возможности повторного использования: как работать с циклами «В то время как истинно»? - PullRequest
0 голосов
/ 15 октября 2010

Я недавно поигрался с модулем pybluez для поиска ближайших устройств Bluetooth.Теперь я хочу расширить программу, чтобы также находить близлежащие клиентские устройства WiFi.

Сканер WiFi-клиента должен иметь петлю While True для постоянного мониторинга радиоволн.Если бы я написал это в виде одной файловой программы, это было бы просто.

import ...

while True:
    client = scan()
    print client['mac']

Однако я хочу сделать этот модуль.Я хочу иметь возможность использовать его позже и, возможно, заставить других использовать его тоже.Что я не могу понять, так это как обрабатывать цикл.

import mymodule

scan()

Если предположить, что первым примером кода был 'mymodule', эта программа просто распечатывает данные на стандартный вывод.Я хотел бы иметь возможность использовать эти данные в моей программе вместо того, чтобы модуль распечатывал их ...

Как мне кодировать модуль?

Ответы [ 4 ]

1 голос
/ 15 октября 2010

Было бы полезно два интерфейса.

  1. scan () сам, который возвратил список найденных устройств, так что я мог вызвать его, чтобы получить мгновенный снимок доступного Bluetooth. Может потребоваться параметр max_seconds_to_search или max_num_to_return.
  2. Функция «уведомить о найденном», которая приняла обратный вызов. Например (возможно опечатки, я просто списал это с манжеты).

    def find_bluetooth(callback_func, time_to_search = 5.0):
      already_found = []
      start_time = time.clock()
      while 1: 
        if time.clock()-start_time > 5.0: break
        found = scan()
        for entry in found:
          if entry not in already_found:
            callback_func(entry)
            already_found.append(entry)
    

    , который будет использоваться при этом:

    def my_callback(new_entry):
      print new_entry    # or something more interesting...
    
    
    find_bluetooth(my_callback)
    
1 голос
/ 15 октября 2010

Как насчет чего-то довольно простого, например:

mymodule.py

import ...
def scanner():
    while True:
        client = scan()
        yield client['mac']

othermodule.py

import mymodule
for mac in mymodule.scanner():
    print mac

Если вы хотите что-то более полезное, я бы также предложил фоновую ветку, как @kindall.

1 голос
/ 15 октября 2010

Я думаю, что наилучшим подходом будет запуск сканера в отдельном потоке от основной программы. Модуль должен иметь методы, которые запускают и останавливают сканер, и другой, который возвращает текущий список точек доступа (используя блокировку для синхронизации). См. модуль потоков .

0 голосов
/ 15 октября 2010

Если я получу ваш вопрос, вы хотите scan() в отдельном файле, чтобы его можно было использовать позже.

Создать utils.py

def scan():
    # write code for scan here.

Создать WiFi.py

import utils

def scan_wifi():
    while True:
        cli = utils.scan()
    ...
    return
...