2015-08-22 3 views
0

Я довольно новичок в python и в настоящее время играю с библиотекой zeroconf.python какой тип данных это?

при попытке зарегистрировать службу в сети, я вижу это в определении функции:

def register_service(self, info, ttl=_DNS_TTL): 
    """Registers service information to the network with a default TTL 
    of 60 seconds. Zeroconf will then respond to requests for 
    information for that service. The name of the service may be 
    changed if needed to make it unique on the network.""" 
    self.check_service(info) 
    self.services[info.name.lower()] = info 
    if info.type in self.servicetypes: 
     self.servicetypes[info.type] += 1 
    else: 
     self.servicetypes[info.type] = 1 
    now = current_time_millis() 
    next_time = now 
    i = 0 
    while i < 3: 
     if now < next_time: 
      self.wait(next_time - now) 
      now = current_time_millis() 
      continue 
     out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA) 
     out.add_answer_at_time(DNSPointer(info.type, _TYPE_PTR, 
              _CLASS_IN, ttl, info.name), 0) 
     out.add_answer_at_time(DNSService(info.name, _TYPE_SRV, 
              _CLASS_IN, ttl, info.priority, info.weight, info.port, 
              info.server), 0) 
     out.add_answer_at_time(DNSText(info.name, _TYPE_TXT, _CLASS_IN, 
             ttl, info.text), 0) 
     if info.address: 
      out.add_answer_at_time(DNSAddress(info.server, _TYPE_A, 
               _CLASS_IN, ttl, info.address), 0) 
     self.send(out) 
     i += 1 
     next_time += _REGISTER_TIME 

Любой знает, какой тип info предназначается, чтобы быть?

EDIT
Благодарим за ответ, что это ServiceInfo класс. Помимо того факта, что докшлинга предоставляет этот ответ, когда он его ищет. Я до сих пор неясно, на:

  • процесса эксперт питона программистов следовать при встрече такого рода ситуации - какие шаги предпринять, чтобы найти тип данных для info сказать, когда строка документации не была доступна?
  • Как знает интерпретатор python info имеет класс ServiceInfo, если мы не укажем тип класса как часть входного параметра для register_service? Как он знает info.type является допустимым свойством, и говорят, что info.my_property нет?
+0

Где вы видите это определение? Я не могу найти 'register_service' в https://github.com/wmcbrine/pyzeroconf – ryachza

+0

Я собирался добавить' info .__ class__' в функцию 'register_service', но я не могу назвать функцию' info' является входным параметром.Любой другой способ, который я мог бы назвать функцией? Если я добавлю 'info = None', это приведет к аннулированию типа данных? – snowbound

+0

упс, извините @ZJM. Неправильная ссылка. Вот правильный вариант: https://github.com/jstasiak/python-zeroconf – snowbound

ответ

2

Это пример ServiceInfo класс.

Это можно сделать из чтения кода и докстрон. register_service вызывает функцию check_service, которая, я цитирую, «проверяет сеть на уникальное имя службы, изменяя переданную ServiceInfo, если она не уникальна».

+0

привет @Alik. Какие докстры вы видите? Я просмотрел весь экземпляр 'info' в модуле' zeroconf.py' и не смог найти его правильно. Посмотрите, как он используется. (точка), например. 'info.type',' info.address' – snowbound

+0

@snowbound Я обновил свой ответ – Alik

+2

@snowbound: Добро пожаловать в мир динамических языков! То, что вы должны взять на себя из этого, - написать хорошие докстроны в вашем собственном коде, документируя типы данных, где это не очевидно. :) –

1

Похоже, что это должно быть ServiceInfo. Найдено в примерах хранилища:

https://github.com/jstasiak/python-zeroconf/blob/master/examples/registration.py

Редактировать

  1. Я не совсем уверен, что сказать, кроме «каким-либо образом я должен». На практике я не могу вспомнить время, когда контракт интерфейса не был совершенно ясен, потому что это всего лишь часть использования Python. Документация больше соответствует требованиям по этой причине.
  2. Короткий ответ: «Это не так». Python использует концепцию «утиная печать», в которой действителен любой объект, который поддерживает необходимые операции контракта. Вы могли бы дать ему любое значение, которое имеет все свойства, код использует, и он не знал бы разницы. Таким образом, для каждой части 1 в худшем случае вам нужно просто отслеживать каждое использование объекта до тех пор, пока оно передается, и предоставить объект, соответствующий всем требованиям, и если вы пропустите часть, вы получите ошибку времени выполнения для любого пути кода, который его использует.

Мое предпочтение также относится к статической типизации. Во многом я думаю, что документация и модульные тесты просто становятся «более трудными требованиями» при работе с динамической типизацией, поскольку компилятор не может выполнить какую-либо из этих работ для вас.

+0

привет @ryachza, я обновил свой оригинальный вопрос, чтобы узнать, что я не ясно (извините, мой фон сильно типизирован/компилирует языки) – snowbound