Задать вопрос

Правильная и красивая замена if?

Как правильно и красиво заменить большое количество if в проекте.
Есть огромное количество
if request.POST.get('type') == '11':
    pass
if request.POST.get('type') == '12':
    pass
if request.POST.get('type') == '13':
    pass
if request.POST.get('type') == '14':
    pass
if request.POST.get('type') == '15':
    pass
if request.POST.get('type') == '16':
    pass


В голову приходит это как то аккуратно оформить как словарь.
напрмиер вот так:
sort_map = {
        '12': test(),
        '13': test1(),
    }

    method = request.POST.get('type')

    if method:
        sort_key = sort_map.get(method)


но увы так это не работает. функции выполняются при старте приложения сразу.
как их указать просто ссылками я что то не очень понимаю.
какие вообще есть методы для работы с таким огромным количеством if ?
их более 30 у меня.
хочется оформить правильно и красиво.
  • Вопрос задан
  • 832 просмотра
Подписаться 4 Простой 7 комментариев
Решения вопроса 1
@hoftuw Автор вопроса
Мне подсказали более изяшный вариант как мне кажется.

sort_map = {
        '12': test,
        '13': test2,
    }

    sort = request.GET.get('sort_by')

    if sort:
        sort_map[str(sort)]()
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Ну так не вызывайте эти функции, просто указывайте, а вызывайте одну, которую получите из словаря этого. Учить питон надо старательнее. Функция - это объект первого рода в питоне. Функцию можно присвоить в переменную, передать в аргумент.
Ответ написан
Vindicar
@Vindicar
RTFM!
В комментариях уже написали простое решение, а я его чуток разовью.

import typing as tp

Func = tp.Callable[[], None]  # функция без апарметров, возвращает None

class FuncMap:
  def __init__(self):
    self.map: tp.Dict[str, Func] = dict()

  def register(self, key: str) -> tp.Callable[[Func], Func]:
    def decorate(f: Func) -> Func:
      self.map[key] = f
      return f
    return decorate
  
  def get(self, key: str) -> Func:
    return self.map[key]
  
  def run(self, key: str):
    return self.map[key]()

# а вот так этот класс используется
fmap = FuncMap()

@fmap.register('11')
def test():
  print('This is test()')

fmap.run('11')
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы