1

dnspythonを使用してゾーン転送を実行し、A レコードをディクショナリに保存して、後で値をポップできるようにしようとしています。下記参照:

import dns.zone
import dns.query
from dns.exception import DNSException
from dns.rdataclass import *
from dns.rdatatype import *

domain = "mydomain.com"
ns = '1.2.3.4'

try:
    zone = dns.zone.from_xfr(dns.query.xfr(ns, domain))
    print "Zone origin:", zone.origin
except DNSException, e:
    print e.__class__, e

for (name, ttl, rdata) in zone.iterate_rdatas('A'):
    record = { name : rdata }
    print name, rdata
    print record

同じ変数を辞書に保存してその辞書を出力したときと、使用したときの出力printが異なるのはなぜname, rdataですか? 以下の出力を参照してください。

www 1.1.1.1
{<DNS name www>: <DNS IN A rdata: 1.1.1.1>}

私は私の質問を明確にするために推測します:どのように辞書を次のように見せますか: { 'www' : '1.1.1.1' }

4

3 に答える 3

2

これは、辞書の内容がそのキー/値のそれぞれを呼び出すことによって表されるreprのに対し、オブジェクトを直接印刷すると が呼び出されるために発生しますstr

例:

>>> class Fred:
...     def __repr__(self):
...         return "value returned by repr"
...     def __str__(self):
...         return "value returned by str"
...
>>> d = {1: Fred()}
>>> print d
{1: value returned by repr}
>>> print d[1]
value returned by str

これについてできることはあまりありません...印刷して定義しようとしているクラスの独自のバージョンを作成して、 と__repr__同じように動作させることができ__str__ます。__str__または、 の代わりにの結果をレンダリングするカスタム dict-printing 関数を作成することもできます__repr__。しかし、 の代わりに強制的print somedictに使用する組み込みの方法はありません。__str____repr__

>>> print "{" + ", ".join("{} : {}".format(repr(str(key)), repr(str(value))) for key, value in d.iteritems()) + "}"
{'1' : 'value returned by str'}
于 2016-02-10T18:16:49.367 に答える
-3

辞書に値を追加するには

d['key'] = 'value'
于 2016-02-10T18:13:16.633 に答える
-3

これは古い質問であることは知っていますが、同じ問題が発生したため、ここに来ました。Kevin の ansewr を読んだ後、答えの名前を入れた場所を置き換えてみました。「rdata」を「str(rdata)」としましょう。「 DNS IN A rdata:」を含む文字列全体ではなく、IPアドレスだけが返されました。

それが役に立てば幸い

于 2018-04-02T16:49:39.430 に答える