使用断言控制流程

bgu*_*ach 0 python exception control-flow

我想检查一个单词是否有尾随分号。我有一个长字符串中单词的位置,我想检查该位置的字符是否start of word + length of word:。该单词可能是字符串中的最后一个单词,因此尝试获取下一个字符将引发IndexException

我有三个想法:

1)检查我们是否不在字符串的末尾,然后检查它是否不是分号

semicolon_pos = pos_word + len(word) # Possible position
if semicolon_pos < len(long_string) and long_string[semicolon_pos] == ':':
    # do something...
else:
    # do something else
Run Code Online (Sandbox Code Playgroud)

不是通常认为的 pythonic

2) Try- except 分号提取和分号的等式

semicolon_pos = pos_word + len(word) # Possible position
try:
   if long_string[semicolon_pos] == ':':
      # Do something
   else:
      # do something else (which is the same as in the except clause)

except IndexError:
    # do something else
Run Code Online (Sandbox Code Playgroud)

看起来有点奇怪,先提取然后嵌套。我必须做一些小技巧来避免代码重复

3)尝试排除分号提取和断言以确保它是分号

semicolon_pos = pos_word + len(word) # Possible position
try:
    assert long_string[semicolon_pos] == ':'
    # do something
except (IndexError, AssertionError):
    # do something else
Run Code Online (Sandbox Code Playgroud)

结构更扁平并且易于阅读,但我有一种滥用异常用法的感觉。

蟒蛇人怎么说?提前致谢。

use*_*342 5

绝对是滥用断言。原因:当使用该标志运行代码时,断言甚至不会执行-O

使用断言的推荐方法是检查由于算法错误(后置条件)而导致的“不可能”条件。对于前置条件和程序逻辑,应该使用普通异常。