当函数中没有返回“None”时,为什么python在NoneType上失败?

当函数中没有返回“None”时,为什么python在NoneType上失败?,python,python-3.x,Python,Python 3.x,我试图从filteredKeys函数创建一个键列表,但是当我调用该函数时,我得到一个TypeError:“NoneType”对象是不可编辑的 当我打印filteredKeys的结果时,但当我将其转换为列表时,“None”不存在。我错过了什么?这快把我逼疯了 key_list = [] for line in stdout.read().splitlines(): input_line = line input_lin

我试图从filteredKeys函数创建一个键列表,但是当我调用该函数时,我得到一个TypeError:“NoneType”对象是不可编辑的

当我打印filteredKeys的结果时,但当我将其转换为列表时,“None”不存在。我错过了什么?这快把我逼疯了

        key_list = []
        for line in stdout.read().splitlines():
            input_line = line
            input_line = input_line.replace(b'[sudo] password for ufitadmin: ', b'')
            key_individual = str(input_line, 'utf-8')
            key_individual = key_individual.replace(
                'cat: /home/%s/.ssh/authorized_keys: No such file or directory' % user,
                'No key exists for this user.')
            key_list.append(key_individual)


        global keyDict
        keyDict = {}
        keyDict[host] = key_list
        filterString = "No key exists for this user."
        filteredKeylist = []

        def filteredKeys():
            for key,value in keyDict.items():
               for values in value:
                   if values == filterString:
                       return key



        filteredKeylist = list(filteredKeys())

        print(filteredKeylist)
您的filteredKeys函数实际上很可能返回None—当没有任何值与filterString匹配时

此外,您还声明希望从filteredKeys函数创建一个键列表,但由于它返回一个值,要么为None,要么为第一个键返回与filterString匹配的值,因此它不会像您预期的那样工作

更好的实现方式是使其成为生成器:

def filteredKeys():
    for key,values in keyDict.items():
       if filterString in values:
           yield key

filteredKeylist = list(filteredKeys())
但这仍然是一种毫无用处的复杂写作方式:

 filteredKeylist = [key for key, values in keyDict.items() if filterString in values]

此外,在全局范围内,您的代码似乎过于复杂,我已经发现了一个明显的错误,每次迭代时都会覆盖keyDict。

这里的值可能为“无”:对于值中的值:?filteredKeys是否总能找到匹配项,这一点肯定不清楚;当它找不到匹配项并返回键时,它隐式地返回None。而且,这比它需要的代码多得多。在本例中,一个好的SO问题将有一个小的、自包含的代码示例,可能只包括filteredKeys函数,其中包含一个keyDict和filterString,问题是针对该字符串硬编码的。请看,我更新了我的代码以使用一行程序,但是它仍然返回单个列表,而不是一个包含所有值的大型列表。它返回:[[item 1][[item 2]所有单独的行。它不会从您发布的代码中返回任何内容,而是打印单独的列表。这就是人们所期望的,因为您在循环中执行此操作,为每个主机重新创建此列表,以查看已编辑的代码。这实际上是一个完全不同的问题,当然不是代码中唯一的问题,请参阅我关于每次迭代中覆盖KeyDict的注释。我对你的问题给出了解释和解决方案,甚至还提供了一些提示,但我不打算调试你的全部代码。你说得对,你的解决方案回答了我的问题。非常感谢。