首页 > 解决方案 > pythondns - 两个相同的字符串返回不相等

问题描述

我有以下代码,在最后一个 if 语句中我只想比较两个字符串。

import dns.resolver

domain = "google.co.uk"

spf_wrong ='"v=spf1 -all"'

test_spf = dns.resolver.resolve(domain , 'TXT')
try:
    for dns_data in test_spf:
        if 'spf1' in str(dns_data):
            dns_correct = dns_data
except:
    print("SPF record not found")
    pass

if dns_data == spf_wrong:
    print("same")
else:
    print("not same")
    print(dns_correct)
    print(spf_wrong)

对我来说,输出显示完全相同的文本。它没有什么不同,但我得到了输出:

not same
"v=spf1 -all"
"v=spf1 -all"

找到另一个线程,然后我将 if 语句修改为以下内容:

if dns_data == spf_wrong:
    print("same")
else:
    print("not same")
    print(repr(dns_correct))
    print(repr(spf_wrong))

现在我得到以下输出:

not same
<DNS IN TXT rdata: "v=spf1 -all">
'"v=spf1 -all"'

所以我的问题是,我该怎么做呢?Python 认为这些字符串是不同的,我认为使用 repr() 函数表明它们是不同的,但我不确定如何解决这个问题。

标签: python-3.x

解决方案


dns_correct 不是一个字符串,它是一个<class 'dns.rdtypes.ANY.TXT.TXT'>

一个字符串可能永远不会出现==在这个类中。

当你打电话时print(),你隐含地调用了__str__()rdtypes.ANY.TEXT.TEXT 上的函数,这就是为什么当你打印它们时它们看起来是一样的。

您可以将 print 视为这样做:

print(str(dns_correct))

这是我使用的 python3 repl 会话。它应该进一步澄清。

>>> import dns.resolver
>>>
>>> domain = "google.co.uk"
>>>
>>> spf_wrong ='"v=spf1 -all"'
>>>
>>> test_spf = dns.resolver.resolve(domain , 'TXT')
>>> try:
...     for dns_data in test_spf:
...             if 'spf1' in str(dns_data):
...                     dns_correct = dns_data
... except:
...     print("except")
...
>>> dns_correct
<DNS IN TXT rdata: "v=spf1 -all">
>>> print(dns_correct)
"v=spf1 -all"
>>> type(dns_correct)
<class 'dns.rdtypes.ANY.TXT.TXT'>
>>> str(dns_correct) == spf_wrong
True
>>> dns_correct == spf_wrong
False

如果您查看@源代码,我们会发现__str__函数调用了另一个调用的函数to_text,该函数会产生您在打印时看到的输出

# https://www.dnspython.org/docs/1.16.0/dns.rdata-pysrc.html#Rdata.__str__
186 -    def __str__(self): 
187          return self.to_text() 
# https://www.dnspython.org/docs/1.16.0/dns.rdtypes.txtbase-pysrc.html#TXTBase.to_text
49 -    def to_text(self, origin=None, relativize=True, **kw): 
50          txt = '' 
51          prefix = '' 
52          for s in self.strings: 
53              txt += '{}"{}"'.format(prefix, dns.rdata._escapify(s)) 
54              prefix = ' ' 
55          return txt 

推荐阅读