Python调度器和场景特定的函数和子函数

2024-04-20 05:09:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试用Python编写几个函数(dispatcher+场景特定函数和子函数),如下所示:

def dispatcher(event):
    if event['name'] == 'func_a':
        return func_a(event['data'])
    # several elif statements here
    elif event['name'] == 'func_n':
        return func_n(event['data'])


def func_a(data):
    """ multi-scenario function returning dict"""
    # Scenario A
    if data['certain_param'] == 'certain value':
        # do something
        # that takes several lines of code
        return {'result': 'scenario A'}

    # Scenario B
    elif data['certain_param'] == 'another value':
        # do something else
        # that takes several lines of code
        return {'result': 'scenario B'}

    # some other elif scenarios go here

    return {'result': 'Fail'}


# func_b(), func_c(), .... go here (similar to func_a())


def func_n(data):
    """ similar logic to funcs a, b, ...."""
    pass

我想把一个很长的func\u a()分解成几个子函数(每个场景一个)。这里有两个选项:

# makes 2 calls to each scenario sub-function (not ideal)
def func_a(data):
    """ same func_a() above"""
    # Scenario A
    if func_a_scenario_a(data):
        return func_a_scenario_a(data)

    # other elifs

    # Scenario N
    elif func_a_scenario_n(data):
        return func_a_scenario_n(data)

另一种编写函数a()的方法是:

# Not very Pythonic
def func_a(data):

    result = func_a_scenario_a(data)
    if result:
        return result

    result = func_a_scenario_b(data)
    if result:
        return result

    # repeat for every scenario

有什么更好的方法来做上述工作?可能使用eval('some_func()')?或者别的什么?谢谢


Tags: to函数eventdatareturnifheredef
1条回答
网友
1楼 · 发布于 2024-04-20 05:09:34

您可以创建一个decorator,该decorator可以决定传递给它的包装函数的内容。decorator可以存储一个以函数名作为键的字典,以及一个要传递给与键同名的函数的关联值:

def dispatcher(f):
   registry = {'func_a':"arbitrary_data", 'func_n':"arbitrary_data_1"}
   def wrapper(data):
      return f(registry[f.__name__])
   return wrapper

@dispatcher
def func_a(data):
  #do something with data
  return 

@dispatcher
def func_n(data):
  #do something with data
  return 

func_a("somedata")
func_n("someotherdata") #functions called be called normally

相关问题 更多 >