一位用戶建議,對于我的分詞器狀態機,我定義了一個由狀態鍵控的字典,其中每個值都是一個由該狀態的輸入鍵控的字典。我在第二部分苦苦掙扎,因為我不知道如何將當前函式重新格式化為輸入查找表。
我原來的功能:
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)
pt.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)
}
在某些情況下,狀態機一次將接收一個字符/輸入,我將不得不根據該字符執行操作。這里棘手的一點是,當我必須檢查輸入是否來自 reconsume() 函式時,該函式要求我在某個狀態下使用相同的字符 - 而不是下一個輸入。我也不知道如何在字典中表示其他任何“case _”,也不知道如何呼叫多個函式。
任何幫助,將不勝感激。
uj5u.com熱心網友回復:
在這種情況下,if/else 陳述句可以說比 switch 陳述句更具可讀性,而 Python 中的 switch 陳述句沒有性能優勢。dict方式可能有性能優勢,但只適用于大量情況,一般可讀性不強
但是,如果您致力于 dict 方法,那么我會建議兩件事:
- 對于需要呼叫多個函式的每種情況,撰寫一個呼叫它們的新函式并將其放入 case dict
- 先處理通配符情況:
- 使用 if/else 陳述句直接呼叫適當的函式,然后跳過 dict 呼叫
- 或一個 if 陳述句,將您的字串更改為您的 dict 中的適當鍵
根據您的回復,這是更改字串選項:
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]()
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/451082.html
