导入的功能不是迭代“TypeError:'NoneType'对象>不可迭代”......我该如何使用?

时间:2009-12-28 16:41:14

标签: python

这是我现在正在研究的python - 我没有列出所有这些代码,所以如果你需要的东西是“缺失”,我道歉 - 我想我可以解释得很好而没有其余的它...

下面是一个函数main() - 这在我的脚本中没有明确定义 - 它是从其他人制作的另一个脚本中导入的。当它被调用时,它输出一个很长的列表,列出了每个可用的模块python可以调用。我正在尝试为每个模块添加行号。因此,当它输出时,它是一个非常长的模块名称列表(我假设函数main()在每个模块之后放置“\ n”,因为它打印一个模块,然后是新行,然后是另一个模块名称)。我正在尝试做的是获取这些值,并在每个模块名称前面添加一个行号。

   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和计数器报告相同的事情,但我故意这样做,因为它与我在文档中其他地方的代码一致,但没有使用此设置。

当运行此代码片段时(使用脚本的其他部分),它会报告:

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 :(得分:2)

函数main 将行打印到标准输出;它不会返回任何东西。更确切地说,它返回None对象,因此all_mods is None。这就是“'NoneType'对象不可迭代的原因”,因为你试图用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__

答案 1 :(得分: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)

p.s。,我不确定什么算作“所有模块”给你,但如果它是当前导入的模块,你可以通过查看sys.modules.keys()得到这个。

答案 2 :(得分: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

这将起作用,不需要修改原始程序。