2009-12-28 94 views
0

这是我现在正在使用的python snip-it,我没有列出所有这些代码,所以如果你需要的东西是“缺失”,我很抱歉 - 我想我可以很好地解释它,而没有其余的它...导入的函数不迭代“TypeError:'NoneType'object>不可迭代”...我如何完成这项工作?

下面是一个函数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 
+0

啊对不起 - 我在使用“>”时遇到了问题,谢谢你的支持。 – 2009-12-28 16:56:15

+0

它是一半可读的。请修复错误追溯以正确格式化,也。这不是Python通常看到的东西,所以换行被破坏了。请修复它是Python错误追溯。为了在SO上发布信息,请适当缩进四个空格。正确的格式将使人们更容易阅读和回答你的问题。 – 2009-12-28 17:34:09

+0

k现在已经修复 - 希望。感谢您的所有见解/帮助。我现在审查你的建议。 – 2009-12-29 00:54:17

回答

2

功能main打印线到标准输出;它不会返回任何东西。更确切地说,它返回None对象,因此all_mods is None。这是'NoneType'对象不可迭代的原因,因为你试图用for x in all_mods迭代它。

这里有一个非常hackish的解决方案,将工作:

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

我想尽可能多(谢谢您的确认),但是有没有办法“使用标准输出”并将行号放在它们的前面? 最终,我想要做的就是将行号映射到模块名称(如类似字典),而不是键入模块名称,您键入行号,然后可以像这样使用它... 我正在考虑从main()获取输出并将其放入一个字典类型的容器中,然后将其打印出来(它现在先打印出来,对字典没有任何影响) - 我该如何实现这一点? – 2009-12-28 16:49:00

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) 

ps的,我不知道作为“所有模块”给你真正重要的,但如果它是当前导入的模块,您可以只需看看sys.modules.keys()即可获得。

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

我发现“http://www.ncsa.illinois.edu/UserInfo/Resources/Hardware/IBMp690/IBM/usr/share/man/info/en_US/a_doc_lib/cmds/aixcmds4/nl.htm”引用了“ nl“命令,我明白它做了什么,但是我根本无法完成它 - 我尝试从命令提示符(win32)和IDLE执行,在help()中查找,尝试加载并搜索任何名为nl的模块 - 并且我没有看到它...... – 2009-12-29 07:44:13

+0

@Nascent_Notes:请更新您的问题以表示赢32。Windows中没有'nl'命令。 – 2009-12-29 15:04:14