2

我正在尝试使用 dnspython 库,并且对他们在此页面上查询 MX 记录的示例感到有些困惑:www.dnspython.org/examples.html:

import dns.resolver

answers = dns.resolver.query('dnspython.org', 'MX')
for rdata in answers:
    print 'Host', rdata.exchange, 'has preference', rdata.preference

在 python CLI 中,一个 dir(answers) 给了我:

['__class__','__delattr__','__delattr__','__delslice__','__dict__','__doc__','__getattr__','__getattribute__','__getitem__','__getslice__','__hash__','__init__',' __iter__','__len__','__module__','__new__','__reduce__','__reduce_ex__','__repr__','__setattr__','__str__','__weakref__','expiration','qname','rdclass' , 'rdtype', '响应', 'rrset']

有两件事让我感到困惑(它们是相关的):

  • 迭代 answers 对象。示例中的 rdata 是什么?
  • 答案的属性或方法都不匹配交换或偏好。显然 rdata 不仅仅是答案的简单别名,但我不明白这些属性来自哪里。
  • 4

    4 回答 4

    1

    在示例代码中,answers是一个包含零个或多个项目的可迭代对象,每个项目rdata依次分配。要查看各个响应的属性,请尝试:

    dir(answers[0])
    
    于 2009-05-20T00:10:38.973 回答
    1

    answers 是一个可迭代的,如其“__iter__”方法所示。将答案视为 rdata 列表。

    您可以尝试这样做以从答案中获取 1 个 rdata:

    answers.__iter__().next()
    
    于 2009-05-20T00:14:56.733 回答
    1

    我还没有看过dns.resolver- 我只是将它添加到不断增长的要检查的东西列表中。我猜这rdata指的是 RFC1035 的第 4.1.3 节中描述的资源记录类型特定数据。除了查询和标头之外,DNS 请求的响应还包含三个数据部分:

    1. 答案
    2. 权威名称服务器记录
    3. 其他资源记录

    从外观上看,它dns.resolver.query()正在返回第一部分。在这种情况下,答案部分中的每个资源记录将根据记录类型具有不同的属性。在这种情况下,您要求提供MX记录,因此记录应该具有您所拥有的属性 -exchangepreference. 这些在 RFC1035 的第 3.3.9 节中进行了描述。

    我怀疑这dns.resolver是压倒一切的__getattr__或类似的东西来执行你所看到的魔法,所以你不会直接在dir(). 使用 RFC1035 中定义的属性很可能是安全的。我明天一定要检查一下,因为我需要一个不错的 Python DNS 子系统。

    感谢您提及此模块并享受 DNS 的乐趣。如果你真的深入研究它是如何工作的,那真的是非常有趣的东西。我仍然认为这是最近风靡一时的 ReSTful 事物的早期表达之一;)

    于 2009-05-20T04:45:08.667 回答
    0

    如果您使用的是 Python 2.6,则获取任何可迭代项(例如answers此处)的第一项的“正确”方法是next(iter(answers)); answers如果您想在空迭代时避免异常,next(iter(answers), somevalue)则将返回somevalue而不是 raise StopIteration。如果您使用的是 2.5,则iter(answers).next(),但try/except StopIteration:如果您需要处理可能的空迭代,则必须在语句中使用它。

    于 2009-05-20T01:38:01.090 回答