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__'、'__delitem__'、'__delslice__'、'__dict__'、'__doc__'、'__getattr__'、'__getattribute__'、'__getitem__'、'__getslice__'、'__h __iter __'、' __len __'、' __module __'、' __new __'、' __reduce __'、' __reduce_ex __'、' __repr __'、' __setattr __'、' __str __'、' __weakref __'、' expiration'、' 、'rdtype'、'response'、'rrset']

2つのことが私を混乱させています(これらは関連しています):

  • Answersオブジェクトの反復。例のrdataとは何ですか?
  • 回答の属性または方法のいずれも、交換または好みに一致しません。明らかに、rdataは単なる回答のエイリアスではありませんが、それらの属性がどこから来ているのかわかりません。
  • 4

    4 に答える 4

    1

    サンプルコードでanswersは、は0個以上のアイテムを含む反復可能なオブジェクトであり、それぞれrdataが順番に割り当てられます。個々の応答のプロパティを確認するには、次のことを試してください。

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

    「__iter__」メソッドで示されるように、answersは反復可能です。回答をrdataのリストと考えてください。

    これを実行して、回答から1つのrdataを取得してみてください。

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

    私はまだ見ていdns.resolverません-私はそれをチェックするものの増え続けるリストに追加しただけです。これは、RFC1035のセクション4.1.3でrdata説明されているリソースレコードタイプ固有のデータを参照していると思います。DNS要求の応答には、クエリとヘッダーに加えて、次の3つのデータセクションが含まれます。

    1. 回答
    2. 権威あるネームサーバーの記録
    3. 追加のリソースレコード

    見た目からdns.resolver.query()最初のセクションを返しています。この場合、回答セクションの各リソースレコードは、レコードタイプに基づいて異なる属性を持ちます。この場合、レコードを要求しMXたので、レコードはあなたが持っている属性を正確に持つ必要があります-exchangepreference。これらはRFC1035のセクション3.3.9で説明されています。

    dns.resolverでフィールドが直接表示されないように、これがオーバーライド__getattr__されているか、表示されている魔法を実行するのに似ていると思われますdir()。RFC1035で定義されている属性を安全に使用できる可能性があります。Python用のまともなDNSサブシステムが必要なので、明日は間違いなくこれをチェックする必要があります。

    このモジュールについて言及していただきありがとうございます。DNSを楽しんでください。あなたがそれがどのように機能するかを本当に掘り下げるならば、それは本当にかなり面白いものです。最近大流行しているのは、そのReSTfulなものの初期の表現の1つだと今でも思います;)

    于 2009-05-20T04:45:08.667 に答える
    0

    answersPython 2.6を使用している場合、反復可能なもの(ここなど)の最初のアイテムを取得する「適切な」方法は次のとおりですnext(iter(answers))answersが空のイテラブルであるときに例外を回避したい場合は、を上げる代わりにnext(iter(answers), somevalue)戻ります。2.5を使用している場合は、ですが、空の反復可能ファイルを処理する必要がある場合は、ステートメント内で使用する必要があります。somevalueStopIterationiter(answers).next()try/except StopIteration:

    于 2009-05-20T01:38:01.090 に答える