2009-05-20 31 views
2

我試圖使用dnspython庫,並且我以他們爲榜樣有點糊塗了這個網頁上查詢MX記錄:www.dnspython.org/examples.html:dnspython和Python對象

import dns.resolver 

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

在Python CLI,一個目錄(答案)給我:

['__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不僅僅是一個簡單的答案別名,但我不明白這些屬性來自哪裏。
  • 回答

    1

    我還沒有看過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玩得開心。如果你真的瞭解它的工作原理,這真的很有趣。我仍然認爲這是這些日子裏所有的憤怒事件的早期表現之一;)

    +0

    啊,你說得對。查看代碼,我在「答案」類中找到了此評論: 爲了方便起見,答案對象實現了很多順序 協議,並將其轉發到其rrset。例如。 「for a answer」爲 等同於「for a answer.rrset」,「answer [i]」與「answer.rrset [i]」等效爲 ,「answer [i:j]」等價於 「answer.rrset [i:j]」。 – 2009-05-20 17:03:03

    1

    在示例代碼中,answers是一個包含零個或多個項目的可迭代對象,每個項目依次分配給rdata。要查看各個響應的屬性,請嘗試:

    dir(answers[0]) 
    
    1

    答案是一個可迭代的,如其「__iter__」方法所示。將答案想象成rdatas的列表。

    你可以嘗試這樣做是爲了得到答案1個RDATA:

    answers.__iter__().next() 
    
    0

    如果你在Python 2.6中,「正確」的方式來獲得任何可迭代的第一個項目(如answers這裏)是next(iter(answers));如果你想避免當answers是空的迭代時的異常,那麼next(iter(answers), somevalue)將返回somevalue而不是提高StopIteration。如果您使用的是2.5,那麼iter(answers).next(),但如果您需要處理可能的空迭代,則必須在try/except StopIteration:語句中使用它。