返回计数而不是使用全局变量的更好方法

问题描述 投票:0回答:2

我有以下代码(使用dnspython),它可以工作 - 但它使用我不喜欢的全局变量。我以为我可以使用递归函数,但没有明显的结束。

有没有人对如何改进这个有任何想法?

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)
python dns spf
2个回答
1
投票

这是一个带有正确局部变量的略微清理的递归函数。

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()对象(以及如果你想传递共享解析器对象的方式)。


0
投票

为什么不将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)
© www.soinside.com 2019 - 2024. All rights reserved.