dnspython和python对象

时间:2009-05-20 00:07:31

标签: python dns dnspython

我正在尝试使用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(答案)给了我:

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

有两件事让我感到困惑(相关):

  • 迭代答案对象。示例中的rdata是什么?
  • 答案的任何属性或方法都不符合交换或偏好。很明显,rdata不仅仅是答案的简单别名,但我不明白这些属性的来源。
  • 4 个答案:

    答案 0 :(得分:1)

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

    dir(answers[0])
    

    答案 1 :(得分:1)

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

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

    answers.__iter__().next()
    

    答案 2 :(得分:1)

    我还没有看过dns.resolver - 我刚刚将它添加到不断增长的内容列表中。我猜想rdata是指Section 4.1.3 of RFC1035中描述的资源记录类型特定数据。除了查询和标题之外,DNS请求的响应还包含三个数据部分:

    1. 答案
    2. 权威名称服务器记录
    3. 其他资源记录
    4. 从它的外观dns.resolver.query()返回第一部分。在这种情况下,答案部分中的每个资源记录将根据记录类型具有不同的属性。在这种情况下,您要求提供MX条记录,以便记录完全具有您拥有的属性 - exchangepreference。这些在Section 3.3.9 of RFC1035中描述。

      我怀疑dns.resolver覆盖__getattr__或类似的东西,以执行您所看到的魔法,因此您不会直接在dir()中看到这些字段。您可以安全地使用RFC1035中定义的属性。我明天必须要检查这个,因为我需要一个适合Python的DNS子系统。

      感谢您提及此模块并享受DNS带来的乐趣。如果你真的深入研究它是如何工作的,这真的很有趣。我仍然认为这是现在风靡一时的早期表达之一;)

    答案 3 :(得分:0)

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