如何在实现自动机时处理Python KeyError?

如何在实现自动机时处理Python KeyError?,python,Python,我正在使用Python实现一个简单的自动机函数 def RunAutomata(transition, initial, accepting, s): state = initial for c in s: try: state = transition[state][c] except KeyError: return False return state in accepting dfa

我正在使用Python实现一个简单的自动机函数

def RunAutomata(transition, initial, accepting, s):
    state = initial
    for c in s:
        try:
            state = transition[state][c]
        except KeyError:
            return False
    return state in accepting

dfa = {0:{'a':1, 'b':2},
       1:{'c':3,'d':2},
       2:{'f':3},
       3:{'e':1}}

RunAutomata(dfa, 0, {2}, 'bfecedfedf')
这段代码的直觉:它检查dfa和字符串,以确定给定dfa下是否接受该字符串。如果接受返回True,否则返回False

在这里您可以看到,在字典中,我使用了字母键,所以在遍历时,如果找不到键,它会抛出KeyError。 我使用try-except块来处理它,但我想知道是否有更好的替代方法可以使用异常处理funda来解决这个问题


编辑:从@omri_sadon那里得到了一个解决方案。非常感谢。请随时发布一些其他不同的方式以及

您可以使用dict
get
方法

transition.get(state) # default for None

transition.get(state, False) # If key not in dict, False is returned
方法
get()
返回给定键内的值


如果dict中没有键,则返回默认值。

您可以使用dict
get
方法

transition.get(state) # default for None

transition.get(state, False) # If key not in dict, False is returned
方法
get()
返回给定键内的值



如果dict中没有键,则返回默认值。

由于这不是很简单,请您解释一下为什么返回
None
值是可以接受的。谢谢。。在这里,我修改了代码以得到我想要的。{def RunAutomata(transition,initial,accepting,s):state=initial for c in s:state=transition[state]。获取(c)接受dfa中的返回状态={0:{'a':1,'b':2},1:{'c':3,'d':2},2:{'f':3},3:{'e':1}运行自动机(dfa,0,{'2},'bfeceedfed')}@Rightleg,你是什么意思?这样,您就不会得到异常,只要
get
方法返回None,您就可以按照您想要的方式处理它。您可以返回除None之外的其他值,这取决于业务流。我认为我们不能像default=None这样放置关键字参数。。这样,代码就被破坏了,否则,它就可以正常工作了。无论如何谢谢。@Jyotirmay
transition.get(state,False)
你可以试试这个。既然这不是那么简单,你能解释一下为什么返回
None
值是可以接受的吗?谢谢。。在这里,我修改了代码以得到我想要的。{def RunAutomata(transition,initial,accepting,s):state=initial for c in s:state=transition[state]。获取(c)接受dfa中的返回状态={0:{'a':1,'b':2},1:{'c':3,'d':2},2:{'f':3},3:{'e':1}运行自动机(dfa,0,{'2},'bfeceedfed')}@Rightleg,你是什么意思?这样,您就不会得到异常,只要
get
方法返回None,您就可以按照您想要的方式处理它。您可以返回除None之外的其他值,这取决于业务流。我认为我们不能像default=None这样放置关键字参数。。这样,代码就被破坏了,否则,它就可以正常工作了。无论如何谢谢。@Jyotirmay
transition.get(state,False)
你可以试试这个。请注意,这个
try
-
除了
的方法本质上并不坏。没错,但我想知道其他可能的方法,因为我是python新手,@Jyotirmay你可能没有终端状态…?我不明白,什么是终端状态?请注意,这种<代码>尝试<代码>-<代码>除了<代码>之外的方法本质上并不坏。确实如此,但我想知道其他可能的方法来做同样的事情,因为我是python新手,@jyotir你可能没有终端状态…?我不明白,终端状态是什么?