Функции Python рекурсивно вызывают друг друга с помощью словаря, хранящего их имя

У меня есть следующий сценарий:

  • существует несколько функций, каждая из которых принимает определенные аргументы
  • они вызывают друг друга на основе аргументов рекурсивно / итеративно до тех пор, пока не будут выполнены определенные условия, которые могут быть выведены из аргументов
  • Я могу делать if-elifв этих функциях, но так как это вызовет много if-elifвнутри всех этих функций, я подумал, что я должен использовать словарь, хранящий ссылку на эти функции против их имени в качестве ключа, а затем хэш в этот словарь (используя содержимое аргумента), чтобы получить и вызвать функцию, которую нужно вызвать.

Проблема в том, что я не могу решить, где определить этот словарь, до всех функций (так как все функции будут использовать этот словарь) или после всех функций (так как словарь будет использовать все эти функции).

Ниже я попытался имитировать сценарий. Я использовал случайную функцию, решайте, какую функцию вызывать, вместо того, чтобы выводить ее из аргументов. Также я использовалrecurCount, чтобы решить, когда остановить рекурсивные вызовы.

import random

# funcDict = {"fun1": fun1,
#             "fun2": fun2,
#             "fun3": fun3,
#             "fun4": fun4}

#Traceback (most recent call last):
#  File "C:...temp.py", line 107, in <module>
#    funcDict = {"fun1": fun1,
#NameError: name 'fun1' is not defined

funcList = ["fun1","fun2","fun3","fun4"]
recurCount = 5

def fun1():
    global recurCount
    print("fun1")
    if(recurCount == 0):
        return 
    else:
        recurCount= recurCount-1
        funcDict[random.choice(funcList)]()  #recursive call

def fun2():
    global recurCount
    print("fun2")
    if(recurCount == 0):
        return 
    else:
        recurCount= recurCount-1
        funcDict[random.choice(funcList)]()  #recursive call

def fun3():
    global recurCount
    print("fun3")
    if(recurCount == 0):
        return 
    else:
        recurCount= recurCount-1
        funcDict[random.choice(funcList)]()  #recursive call

def fun4():
    global recurCount
    print("fun4")
    if(recurCount == 0):
        return 
    else:
        recurCount= recurCount-1
        funcDict[random.choice(funcList)]()  #recursive call

fun1()

# funcDict = {"fun1": fun1,
#             "fun2": fun2,
#             "fun3": fun3,
#             "fun4": fun4}

#Traceback (most recent call last):
#  File "C:...temp.py", line 152, in <module>
#    fun1()
#  File "C:...temp.py", line 123, in fun1
#    funcDict[random.choice(funcList)]()
#NameError: name 'funcDict' is not defined

1 ответ

  1. Словарь требует, чтобы функции были уже определены, в то время как первый вызов любой из функций требует, чтобы словарь был уже определен. Поэтому словарь следует определить после всех определений функций и перед первым вызовом любой из функций:

    def fun1():
        ...
    
    def fun2():
        ...
    
    def fun3():
        ...
    
    def fun4():
        ...
    
    funcDict = {"fun1": fun1,
                "fun2": fun2,
                "fun3": fun3,
                "fun4": fun4}
    
    fun1()