有没有一种方法可以格式化字典,使其表现得像一个取决于键的函数?

Is there a way to format a dictionary, so that it behaves like a function depending on the key?

一位用户建议,对于我的分词器状态机,我定义了一个以状态为键的字典,其中每个值都是一个以该状态的输入为键的字典。我正在为第二部分而苦苦挣扎,因为我不知道如何将当前函数重新格式化为输入查找 table。

我的原函数:

def data_state(cur_codepoint:str, reconsume:bool):
    if reconsume == True: 
        codepoint = cur_codepoint 
    else:
        codepoint = consume_next_input_char()
    match codepoint:
        case '&':
                return_to(data_state, codepoint)
                switch_to_state('character_reference')
        case '<':
                switch_to_state('tag_open')
        case None:
                emit_token(EOF)
        case _:
                emit_token(codepoint)

第 1 部分大纲:

States = { 
    'data': data,
    'rcdata': rcdata,
    #Remaining states
    #...
}

我在 pt.2 的尝试:

data = {
    '&': ( return_to(data_state, codepoint), switch_to_state('character_reference') ),
    '<': switch_to_state('tag_open'),
    None: emit_token(EOF),
    _: emit_token(codepoint)
}

对于某些上下文,状态机将一次接收一个 character/input,我将不得不根据该字符的内容执行操作。这里棘手的一点是,当我必须检查输入是否来自 reconsume() 函数时,该函数要求我在特定状态下使用相同的字符——而不是下一个输入。我也不知道如何在字典中表示其他任何东西 'case _' 也不知道如何调用多个函数。

如有任何帮助,我们将不胜感激。

在这种情况下,if/else 语句可以说比 Python 中的 switch 语句更具可读性,而 switch 语句没有性能优势。 dict 方式可能有性能上的好处,但只是针对大量的情况,而且一般来说可读性不是很好

但是,如果您致力于 dict 方法,那么我会建议两件事:

  1. 对于每个需要调用多个函数的情况,编写一个调用它们的新函数并将其放入 case dict
  2. 先处理通配符的情况:
  • 使用 if/else 语句直接调用适当的函数然后跳过 dict 调用
  • 或将字符串更改为字典中相应键的 if 语句

根据您的回复,这里是更改字符串选项:

def call_many_funcs():
    func_x(...)
    func_y(...)
    func_z(...)

cases = {
    'a': call_many_funcs,
    'b': some_func,
    'c': some_other_func,
    'not_found': not_found_func
    ...
}

然后执行:

my_case = #whatever

if my_case not in cases.keys():
    my_case = 'not_found'

cases[my_case]()