我正在尝试定义一个函数,该函数检查字符串是否包含字典中的单词并返回true以及匹配的单词。下面是代码段,当单词与字典中的字符串匹配时,一切正常。
def trigcheck(strings,a):
try:
str = strings.split()
m=''
a_match = [True for match in a if match in str]
a=[m for m in a if m in str]
if True in a_match:
return True,a[0]
except:
return False,""
bool1,w=trigcheck("kjfdsnfbdskjhfbskdabs",['hello','do'])
print(bool1)
print(w)
我期望使用不匹配的字符串返回False和''。但这会引发错误:
bool1,w=trigcheck("kjfd s n f dobdskjhfbskdabs",['hello','do'])
TypeError: 'NoneType' object is not iterable
答案 0 :(得分:2)
如果没有引发异常,并且True
不在a_match
中,则根本不会显式return
,从而导致您隐式返回None
。将None
分解为bool1
和w
会引发异常。
在if
检查失败的情况下,通过使无条件返回无条件来修正代码:
def trigcheck(strings,a):
try:
str = strings.split()
m=''
a_match = [True for match in a if match in str]
a=[m for m in a if m in str]
if True in a_match:
return True,a[0]
except Exception: # Don't use bare except unless you like ignoring Ctrl-C and the like
pass
# Failure return is outside except block, so fallthrough reaches
# it whether due to an exception or because the if check failed
return False,""
其他说明:您对match
存在的测试效率相对较低;它不能短路,并且需要临时list
。使用以下代码替换函数主体,该代码依赖于异常处理以在没有匹配项时返回:
def trigcheck(strings,a):
try:
strings = strings.split() # Don't nameshadow builtins, reuse strings instead of shadowing str
return True, next(m for m in a if m in strings)
except StopIteration:
return False, ""
将三个扫描和两个临时list
减少到一次扫描并且没有临时列表,并避免使随机异常静音(例如,TypeError
,因为有人通过了非字符串或不可迭代的一种参数),只捕获表示找不到匹配项的参数即可。