我正在尝试使用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']
有两件事让我感到困惑(相关):
答案 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请求的响应还包含三个数据部分:
从它的外观dns.resolver.query()
返回第一部分。在这种情况下,答案部分中的每个资源记录将根据记录类型具有不同的属性。在这种情况下,您要求提供MX
条记录,以便记录完全具有您拥有的属性 - exchange
和preference
。这些在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:
语句中使用它。