1

我正在尝试使用 进行 zonetransfer 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>}

我想澄清我的问题:我如何使 dict 看起来像: { 'www' : '1.1.1.1' }

4

3 回答 3

2

发生这种情况是因为 dict 的内容通过调用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__. 或者您可以编写一个自定义的 dict-printing 函数来呈现结果__str__而不是__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

我知道这是一个老问题,但来到这里是因为我遇到了同样的问题。在阅读了凯文的回答后,我只是尝试替换我放置答案名称的位置,让我们说“ rdata ”与“ str(rdata) ”。为我返回的只是 IP 地址,而不是包括“ DNS IN A rdata: ”在内的整个字符串

希望能帮助到你

于 2018-04-02T16:49:39.430 回答
-3

在字典中添加一个值

d['key'] = 'value'
于 2016-02-10T18:13:16.633 回答