Один из способов - сопоставить константы с соответствующими обработчиками:
class LanguageData:
def __init__(self, unverified, ready, active, vip):
self.unverified = unverified
self.ready = ready
self.active = active
self.vip = vip
def english():
return LanguageData(1,2,3,4)
def russian():
return LanguageData(5,6,7,8)
LANGUAGE_MAP = {'en': english, 'ru': russian}
Я составил 'en', 'ru'
значения для ясности. Кажется, что 0
есть в вашем случае? Также обратите внимание, что english
и russian
являются автономными функциями. Наконец, класс LanguageData
не является обязательным, вы можете просто вернуть словарь из этих функций. Но легче работать с атрибутами вместо строковых ключей.
А потом в коде:
def run_workflow(provider, language, workflow):
lang_data = LANGUAGE_MAP[language]()
if workflow == 'ready':
url = API + data.ready
elif workflow == 'unverified':
url = API + data.unverified
response = requests.post(url, headers=header, data=json.dumps(conversation))
Конечно, workflow
можно обернуть аналогичным образом, если существует более 2 возможных значений.
Аналогично для provider
. Если действие не зависит одновременно от provider
и language
, в этом случае вам нужна двойная карта:
LANG_PROV_MAP = {
('en', 'xxxx'): first,
('ru', 'yyyy'): second,
}
def run_workflow(provider, language, workflow):
data = LANG_PROV_MAP[(provider, language)]()
...
Оригинальный код можно упростить с помощью сложного декоратора:
LANGUAGE_MAP = {}
def language_handler(lang):
def wrapper(fn):
LANGUAGE_MAP[lang] = fn
return fn
return wrapper
@language_handler('en')
def handler():
return LanguageData(1,2,3,4)
@language_handler('ru')
def handler():
return LanguageData(5,6,7,8)
Также обратите внимание, что если данные являются «постоянными» (т.е. не зависят от контекста), то вы можете полностью опустить вызываемые элементы, чтобы сделать все еще проще:
LANGUAGE_MAP = {
'en': LanguageData(1,2,3,4),
'ru': LanguageData(5,6,7,8),
}
def run_workflow(provider, language, workflow):
data = LANGUAGE_MAP[language]
...