将输出与列表/数组进行比较

1 投票
5 回答
641 浏览
提问于 2025-04-16 07:59

我觉得自己在Python(以及编程方面)还是个初学者,但我正在努力学习Zed A Shaw的《艰难学Python》,慢慢掌握一些知识。

我正在写一个小脚本,用来检查一个域名的实时MX记录是否符合预期,看看有没有被更改(这背后有个长故事)。到目前为止,我已经写出了以下代码:

import dns.resolver
domain = 'bbc.co.uk'
for x in dns.resolver.query(domain,'MX',):
    print x.to_text()

这段代码使用了dnspython模块,可以输出邮件主机和优先级数字。接下来我需要做的就是把这个输出和两个预期的结果进行比较,对于bbc.co.uk来说,这两个结果应该是cluster1a.eu.messagelabs.com和cluster1.eu.messagelabs.com(它们的顺序会根据当前的优先级数字而变化)。

我觉得最好的办法是把预期的结果放到一个数组/列表里,然后让脚本尝试将输出与这个数组/列表进行比较,给出一个真假判断。但是我花了一整天尝试不同的代码组合,这对我来说还是有点难。

最终,我希望如果结果是假的话,可以提醒我或我的同事,但这可以稍后再考虑,因为我还没决定用什么方法来实现这个功能。

有没有好心人能给我一个大概的思路,告诉我实现我想要的结果的最佳做法是什么?

感谢大家花时间来阅读这些内容 :)

谢谢你们,Chris

编辑:这似乎正好实现了我希望的功能,感谢大家的帮助!

import dns.resolver
domain = 'bbc.co.uk'
expected_responses = ['cluster1.eu.messagelabs.com.', 'cluster1a.eu.messagelabs.com.']
for x in dns.resolver.query(domain, 'MX'):
        if x.to_text().split()[1] not in expected_responses:
                print "Unexpected MX record found!"
        else:
                print x.to_text().split()[1] + " OK!"

5 个回答

1

那是关于什么的呢?

import dns.resolver

expected_domains = set(['cluster1a.eu.messagelabs.com.', 'cluster1.eu.messagelabs.com.'])
domains = set(str(mx.exchange) for mx in dns.resolver.query('bbc.co.uk', 'MX'))
if not domains.issuperset(expected_domains):
    print("Missing MX domains:", ", ".join(expected_domains - domains))
3

你的意思是:

x.to_text() in {'cluster1a.eu.messagelabs.com', 'cluster1.eu.messagelabs.com'}

?

1

结果以 'XX dns_entry' 的格式返回,所以你可以这样做:

import dns.resolver
domain = 'bbc.co.uk'
results = []
for x in dns.resolver.query(domain,'MX',):
    results.append(x.to_text().split(' ')[1])
print results

>>> ['cluster1.eu.messagelabs.com.', 'cluster1a.eu.messagelabs.com.']

现在你可以用这个列表进行比较了。

撰写回答