导入功能未迭代 "TypeError: 'NoneType'对象不可迭代"... 我该如何解决?

0 投票
3 回答
1492 浏览
提问于 2025-04-15 17:25

这是我正在处理的一个Python代码片段 - 我没有列出所有的代码,所以如果你觉得有什么“缺失”的部分,我表示抱歉 - 我认为我可以在没有其余部分的情况下很好地解释它...

下面有一个函数 main() - 这个函数在我的脚本中没有明确定义,它是从另一个人写的脚本中导入的。当这个函数被调用时,它会输出一个非常长的列表,列出Python可以调用的所有可用模块。我想给每个模块添加行号。所以当它输出时,会有一个很长的模块名称列表(我猜这个 main() 函数在每个模块后面加了一个换行符,因为它先打印一个模块,然后换行,再打印下一个模块名)。我想做的是把这些值拿来,在每个模块名称前面加上行号。

   elif x == "list" or x == "1":

            print "\n loading... please wait"
            time.sleep(2)
            counter=0

            lnumber = 0
            all_mods = (main())

            for x in all_mods: 
                print lnumber, x
                lnumber = lnumber + 1
                counter = counter + 1

            print "-" * 30, "\nTotal number of modules detected: ", counter

**我知道 lnumber 和 counter 报告的是同样的东西,不过我这样做是故意的,因为它和我文档中其他地方的代码保持一致,那里的代码没有使用这种设置。

当这段代码片段与脚本的其他部分一起运行时,它会返回:

Traceback (most recent call last):
  File "C:\Users\jc\Documents\Python Projects\Projects\myOwnfns\helpwiz.py", line 131, in <module>
    main_loop()
  File "C:\Users\jc\Documents\Python Projects\Projects\myOwnfns\helpwiz.py", line 90, in main_loop
    for x in all_mods: #this variable comes from "list_all_mods" - an external script taken from another author.
TypeError: 'NoneType' object is not iterable

3 个回答

0

nl 命令可以帮你完成这个任务。

python the_existing_program.py | nl

这样应该能满足你的需求。

如果你在使用Windows系统,那么你可以很简单地写一个 nl 的版本。

import fileinput
for n, line in enumerate( fileinput.input() ):
    print "%d %s" % ( n, line )

假设你把它命名为 nl.py

python the_existing_program.py | python nl.py

这样做是可行的,而且不需要对原程序进行修改。

0

我建议list_all_mods()进行重构,如果可能的话。特别是,可以把它改成返回一个值的列表,而不是直接打印出来;或者把它改成一个新的函数find_all_mods(),这个函数返回一个列表,然后重新定义list_all_mods()

def list_all_mods(): 
    print '\n'.join(find_all_mods())

我知道这不是你的代码,所以这可能不是一个选项。如果不行的话,balpha的解决方案可能是你能做的最好选择。之后,如果你想打印带行号的模块,可以这样做:

for (i, module_name) in enumerate(all_mods):
    # n.b.: we use i+1 because we want numbering to start from 1.
    print "%4d %s" % (i+1, module_name)

顺便说一下,我不太确定你所说的“所有模块”指的是什么,但如果是指当前导入的模块,你可以通过查看sys.modules.keys()来获取这些模块。

2

这个 main 函数是用来把内容打印到标准输出的;它并不会返回任何东西。更准确地说,它返回的是 None 对象,所以 all_mods 是 None。这就是为什么会出现 "'NoneType' object is not iterable" 的原因,因为你试图用 for x in all_mods 来遍历它。

这里有一个非常不优雅的解决办法,可以解决这个问题:

import sys, StringIO
buffer = StringIO.StringIO()
sys.stdout = buffer
main()
buffer.seek(0)
all_mods = buffer.read().splitlines()
sys.stdout = sys.__stdout__

撰写回答