导入功能未迭代 "TypeError: 'NoneType'对象不可迭代"... 我该如何解决?
这是我正在处理的一个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 个回答
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
这样做是可行的,而且不需要对原程序进行修改。
我建议对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()
来获取这些模块。
这个 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__