Конфигурация для каждой среды (для простого Python SDK)

У меня есть простой SDK на Python для внутреннего использования. Это в основном 150 ~ 200 строк кода простых вызовов API, красиво обернутых вокруг, которые нам удобно использовать.

Он содержит несколько клиентов с методами (и каждый метод включает в себя некоторые вызовы API).

Итак, правильное использование:

from datatube.datatube import Datatube

client = Datatube()
client.do_stuff(...)

В настоящее время он ожидает 3 переменных среды — две для аутентификации (это секретные) и одна для среды (dev / stg / prod). Я хочу изменить переменную среды, которая будет передаваться в качестве аргумента (кажется, лучше). Так:

from datatube.datatube import Datatube

client = Datatube('stg')
client.do_stuff(...)

Внутри Datatube Я возьму правильный конфиг в зависимости от окружения. На данный момент у меня есть:

class BaseConfig:
    pass


class DevelopmentConfig(BaseConfig):
    DATATUBE_URL = 'https://..'



class StagingConfig(BaseConfig):
    DATATUBE_URL = 'https://..'



class ProductionConfig(BaseConfig):
    DATATUBE_URL = 'https://..'



def get_config(env: str):
    env = env.lower()
    if env == 'dev':
        return DevelopmentConfig()
    if env == 'stg':
        return StagingConfig()
    elif env == 'prod':
        return ProductionConfig()
    else:
        raise KeyError(f"unsupported env: {env}. supported environments: dev/stg/prod")

Если я использую аннотацию типа на get_config нравиться:

def get_config(env: str) -> BaseConfig

Тогда IDE это не понравится (наверное, потому что BaseConfig пуст, но я не знаю, как это сделать красиво — разве абстрактный класс не является излишеством?)

Любые рекомендации были бы полезны.

Использование Python 3.9

1 ответ
1

Наследование классов здесь излишне. Просто используйте экземпляры класса данных:

from dataclasses import dataclass


@dataclass
class Config:
    DATATUBE_URL: str


ENVIRONMENTS = {
    'dev': Config(
        DATATUBE_URL='https://..',
    ),
    'stg': Config(
        DATATUBE_URL='https://..',
    ),
    'prd': Config(
        DATATUBE_URL='https://..',
    ),
}


def get_config(env_name: str) -> Config:
    env = ENVIRONMENTS.get(env_name.lower())
    if env is None:
        raise KeyError(
            f"unsupported env: {env_name}. supported environments: " +
            ', '.join(ENVIRONMENTS.keys()))
    return env

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *