BadCats
@BadCats

Динамически добавить elif ветки в функцию?

Допустим, есть функция:
def some_func(digit_val:int,alt_branches_count:int)

- как в зависимости от значения alt_branches_count - добавлять альтернативные ветки elif, например по ниспадающей от digit_val
- т.е - если, допустим digit_val = 10, а alt_branches_count = 3, то сделать примерно следующее:
def some_func(digit_val:int,alt_branches_count:int)
    if digit_val==1:
         pass
    elif digit_val==2:
         pass
   elif digit_val==3:
         pass
  elif digit_val==4:
         pass

- Важно отметить: Да, я знаю, что пример глупый, знаю, что так делать бессмысленно и вообще нельзя - суть примера кода - не в этом. Приведенный выше код является лишь "игрушечным" примером того, что необходимо реализовать - совершенно для другой цели! Пожалуйста, не предлагайте альтернатив, необходим ответ именно на четко поставленный вопрос и не пишите, пожалуйста, что это бессмысленно - да, в контексте данного примера - бессмысленно.
Для тех, кто не увидел - "четко поставленного вопроса" - продублирую заголовок темы: Как динамически добавить elif ветки в функцию?
  • Вопрос задан
  • 108 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Именно "динамически добавить elif ветки в функцию" никак, а альтернатив вы просите не предлагать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Можно использовать exec для создания функции из строки, но помните, что функция exec небезопасна.

FUNCTION_SOURCE = """def __intermediary_func(digit_val: int):
    if digit_val == 1:
        pass"""

def some_func(digit_val: int, alt_branches_count: int):
    intermediary_func_source = FUNCTION_SOURCE
    for i in range(0, alt_branches_count):
        intermediary_func_source += f"""
    elif digit_val == {i+2}:
        pass"""
    exec(intermediary_func_source, globals())
    print(intermediary_func_source)
    return __intermediary_func(digit_val)


In [14]: print(some_func(10, 3))
def __intermediary_func(digit_val: int):
    if digit_val == 1:
        pass
    elif digit_val == 2:
        pass
    elif digit_val == 3:
        pass
    elif digit_val == 4:
        pass
None
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы