Как задать переменные один раз в классе

#python-3.x #class #variables

Вопрос:

В настоящее время я работаю с небольшим проектом, в котором я создал формат прокси-конвертера, а также доступность используемых прокси-серверов.

В настоящее время я закончил тем, что сделал что-то вроде этого:

 import random
import threading
import time
from typing import Dict

from loguru import logger


class ProxyManager(object):
    def __init__(self, proxy_file_path=None):
        self.proxies = self.load_proxies(proxy_file_path) if proxy_file_path else {}

    @staticmethod
    def load_proxies(proxy_file_path):
        with open(proxy_file_path) as proxy_file:
            proxies = {'https': [], 'http': []}
            for proxy in proxy_file.readlines():
                if proxy.count(':') > 1:
                    ip, port, username, password = proxy.rstrip().split(':')
                    url = f'http://{ip}:{port}:{username}@{password}'
                else:
                    ip, port = proxy.rstrip().split(':')
                    url = f'http://{ip}:{port}'
                proxies['https'].append(url)

            return proxies

    def random_proxy_https(self):
        return random.choice(self.proxies['https'])

    def all_proxies_https(self):
        return [proxy for proxy in self.proxies['https']]


# -------------------------------------------------------------------------
# Proxies path
# -------------------------------------------------------------------------
proxies: Dict[str, ProxyManager] = {
    "rotating": ProxyManager("./proxies/rotating.txt"),
    "test": ProxyManager("./proxies/test.txt")
}

# -------------------------------------------------------------------------
# Proxies available
# -------------------------------------------------------------------------
all_proxies = proxies["rotating"].all_proxies_https()
proxy_dict = dict(zip(all_proxies, ['available'] * len(all_proxies)))

proxy_lock: threading = threading.Lock()


# -------------------------------------------------------------------------
# Initialize availability of proxies
# -------------------------------------------------------------------------
class AvailableProxies:
    def __enter__(self):
        proxy_lock.acquire()
        self.proxy = None

        while not self.proxy:
            available = [
                att for att, value in proxy_dict.items() if "available" in value
            ]
            if available:
                self.proxy = random.choice(available)
                proxy_dict[self.proxy] = "busy"
                break
            else:
                logger.info("Waiting ... no proxies available")
                time.sleep(.2)

        proxy_lock.release()
        return self.proxy

    def __exit__(self, exc_type, exc_val, exc_tb):
        proxy_dict[self.proxy] = "available"
 

Идея заключается в том, что у меня будет несколько сценариев, которым понадобится класс ProxyManager, но не AvailableProxies — Это означает, что мне не нужно устанавливать переменные

 # -------------------------------------------------------------------------
# Proxies available
# -------------------------------------------------------------------------
all_proxies = proxies["rotating"].all_proxies_https()
proxy_dict = dict(zip(all_proxies, ['available'] * len(all_proxies)))

proxy_lock: threading = threading.Lock()
 

если конкретный сценарий не требует класса. Интересно, возможно ли установить переменные внутри класса AvailableProxies и что переменные all_proxies, proxy_dict amp; proxy_lock должны быть установлены только один раз внутри класса, когда мы импортируем AvailableProxies их в скрипт?

Комментарии:

1. даже если класс не импортирован, он все равно будет создан как класс — вот как работает импорт в python — так как же вы планируете, чтобы он не запускался, когда он находится внутри класса ? какое-то if утверждение?

2. Привет @AntiMatterDynamite Я подумал, что в других сценариях я мог бы сделать , например: from proxies import ProxyManager, AvailableProxies и моя мысль заключалась в том, что если я, например, просто обойдусь from proxies import ProxyManager без AvailableProxies , то нет необходимости устанавливать переменные для all_proxies, proxy_dict amp; proxy_lock , если это имеет смысл?

3. нет никакого способа определить, какой класс импортируется таким образом, по крайней мере, не тот, о котором я знаю в python 3.9 — модуль все равно будет импортирован полностью, он просто не будет загромождать ваше глобальное пространство имен, если вы используете from x import y импорт стилей

4. @AntiMatterDynamite ах, я вижу! Тогда в этом случае я бы оставил все как есть и могу только поблагодарить вас за ваш ответ 😀