python-3.x - 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() 函数表明它们是不同的,但我不确定如何解决这个问题。
解决方案
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
推荐阅读
- python - 如何使用 Python 修复 Pyx 模块中的回溯错误?
- python - 以散列形式将密码存储在 MySQL 数据库中 Django App
- powershell - Powershell 调用 -Command 带有空格的属性
- ios - SwiftUI:iPad 上不需要的拆分视图
- javascript - document.getElementById 重新调整不是在 vue.js 中动态更新,每次都返回 null
- css - 反应中的内联css不能动态工作
- excel - 合并不同工作表中的数据
- flask - 将列表传递给引导网格模板的有效方法
- c++ - 对象作为参数析构函数被调用但不是构造函数?
- reactjs - 如何使用 React Native 库使 Jest 测试用例适用于 React 组件?