为什么我的代码返回TypeError:'NoneType'对象不可迭代?

时间:2019-06-20 19:45:41

标签: python-3.x string dictionary nonetype

我正在尝试定义一个函数,该函数检查字符串是否包含字典中的单词并返回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

1 个答案:

答案 0 :(得分:2)

如果没有引发异常,并且True不在a_match中,则根本不会显式return,从而导致您隐式返回None 。将None分解为bool1w会引发异常。

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,因为有人通过了非字符串或不可迭代的一种参数),只捕获表示找不到匹配项的参数即可。