У меня есть простой 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 ответ
Наследование классов здесь излишне. Просто используйте экземпляры класса данных:
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
