有没有一种方法可以格式化字典,使其表现得像一个取决于键的函数?
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 方法,那么我会建议两件事:
- 对于每个需要调用多个函数的情况,编写一个调用它们的新函数并将其放入 case dict
- 先处理通配符的情况:
- 使用 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]()
一位用户建议,对于我的分词器状态机,我定义了一个以状态为键的字典,其中每个值都是一个以该状态的输入为键的字典。我正在为第二部分而苦苦挣扎,因为我不知道如何将当前函数重新格式化为输入查找 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 方法,那么我会建议两件事:
- 对于每个需要调用多个函数的情况,编写一个调用它们的新函数并将其放入 case dict
- 先处理通配符的情况:
- 使用 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]()