Лучший способ вернуть количество, а не использовать глобальные - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть следующий код (с использованием 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)

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Вот немного очищенная рекурсивная функция с правильно локальной переменной.

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 голосов
/ 22 февраля 2019

Почему бы не передать 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)
...