返回count的更好方法,而不是使用globals

2024-06-01 09:39:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的代码(使用dnspython),它可以工作-但是它使用我不喜欢的globals。我想我可以使用递归函数,但没有明显的目的。你知道吗

有人对如何改进这一点有什么想法吗??你知道吗

import dns.resolver

dns_resolver = dns.resolver.Resolver()
dns_resolver.nameservers = ['1.1.1.1', '1.0.0.1']

resolve_count = 0


def get_spf_count(domain_name):
    global resolve_count

    for answer in dns_resolver.query(domain_name, 'TXT'):
        spf = answer.to_text() if 'v=spf1' in answer.to_text() else None

        if spf:
            spf_records = [
                record
                for record in spf.replace('" "', '').replace('"', '').split()
                if record not in ['v=spf1', '~all', '-all', '+all', '?all']
            ]
            for record in spf_records:
                if 'include:' in record:
                    check_domain = record.split(':')[1]
                    get_spf_count(check_domain)
                    resolve_count += 1
                elif record.startswith(('a:', 'mx:', 'ptr:', 'exists:')):
                    resolve_count += 1

get_spf_count('google.com')
print(resolve_count)

Tags: toanswernameinforgetifdns
2条回答

这里是一个稍微清理过的递归函数,带有一个适当的局部变量。你知道吗

import dns.resolver


def get_spf_count(domain_name, dns_resolver=None):
    if dns_resolver is None:
        dns_resolver = dns.resolver.Resolver()
        dns_resolver.nameservers = ['1.1.1.1', '1.0.0.1']

    resolve_count = 0

    for answer in dns_resolver.query(domain_name, 'TXT'):
        spf = answer.to_text() if 'v=spf1' in answer.to_text() else None

        if spf:
            spf_records = [
                record
                for record in spf.replace('" "', '').replace('"', '').split()
                if record not in ['v=spf1', '~all', '-all', '+all', '?all']
            ]
            for record in spf_records:
                if 'include:' in record:
                    check_domain = record.split(':')[1]
                    resolve_count += 1 + get_spf_count(check_domain, dns_resolver)
                elif record.startswith(('a:', 'mx:', 'ptr:', 'exists:')):
                    resolve_count += 1

    return resolve_count


print(get_spf_count('google.com'))

请注意函数所需的一切是如何在函数中是本地的,包括dns.resolver.Resolver()对象(以及如果需要,如何传入共享解析器对象)。你知道吗

为什么不把resolve_count作为变量传入,让函数返回更新后的值呢?你知道吗

def get_spf_count(domain_name, resolve_count):
    for answer in dns_resolver.query(domain_name, 'TXT'):
        spf = answer.to_text() if 'v=spf1' in answer.to_text() else None
        if spf:
            spf_records = [
                record
                for record in spf.replace('" "', '').replace('"', '').split()
                if record not in ['v=spf1', '~all', '-all', '+all', '?all']
            ]
            for record in spf_records:
                if 'include:' in record:
                    check_domain = record.split(':')[1]
                    get_spf_count(check_domain, resolve_count)
                    resolve_count += 1
                elif record.startswith(('a:', 'mx:', 'ptr:', 'exists:')):
                    resolve_count += 1

    return resolve_count    


resolve_count = get_spf_count('google.com', 0)
print(resolve_count)

相关问题 更多 >