【问题标题】:dnspython and python objectsdnspython 和 python 对象
【发布时间】:2010-10-27 12:05:41
【问题描述】:

我正在尝试使用 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__', '__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']

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

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

      标签: python dns dnspython


      【解决方案1】:

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

      dir(answers[0])
      

      【讨论】:

        【解决方案2】:

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

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

        answers.__iter__().next()
        

        【讨论】:

          【解决方案3】:

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

          【讨论】:

            【解决方案4】:

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

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

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

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

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

            【讨论】:

            • 啊,你是对的。查看代码,我在 Answer 类中发现了这样一条注释:为方便起见,answer 对象实现了大部分序列协议,转发到它的 rrset。例如。 “for a in answer”等价于“for a in answer.rrset”,“answer[i]”等价于“answer.rrset[i]”,“answer[i:j]”等价于“answer .rrset[i:j]".
            猜你喜欢
            • 1970-01-01
            • 2021-03-12
            • 1970-01-01
            • 2012-10-05
            • 2018-02-25
            • 2011-07-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多