【问题】
如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | def callBlogFunc(funcToCall, * paraList): funcName = funcToCall.func_name; if (blogIsNetease()): trueFunc = getattr (BlogNetease, funcName); logging.info( "Now will cll netease function: %s" , funcName); elif (blogIsBaidu()) : trueFunc = getattr (BlogBaidu, funcName); logging.info( "Now will cll baidu function: %s" , funcName); else : logging.error( "Invalid blog provider" ); sys.exit( 2 ); return ; print "trueFunc=" ,trueFunc; paraLen = len (paraList); print "paraLen=" ,paraLen; if (paraLen = = 1 ): return trueFunc(paraList[ 0 ]); elif (paraLen = = 2 ): return trueFunc(paraList[ 0 ], paraList[ 1 ]); elif (paraLen = = 3 ): return trueFunc(paraList[ 0 ], paraList[ 1 ], paraList[ 2 ]); elif (paraLen = = 4 ): return trueFunc(paraList[ 0 ], paraList[ 1 ], paraList[ 2 ], paraList[ 3 ]); elif (paraLen = = 5 ): return trueFunc(paraList[ 0 ], paraList[ 1 ], paraList[ 2 ], paraList[ 3 ], paraList[ 4 ]); elif (paraLen = = 6 ): return trueFunc(paraList[ 0 ], paraList[ 1 ], paraList[ 2 ], paraList[ 3 ], paraList[ 4 ], paraList[ 5 ]); elif (paraLen = = 7 ): return trueFunc(paraList[ 0 ], paraList[ 1 ], paraList[ 2 ], paraList[ 3 ], paraList[ 4 ], paraList[ 5 ], paraList[ 6 ]); elif (paraLen = = 8 ): return trueFunc(paraList[ 0 ], paraList[ 1 ], paraList[ 2 ], paraList[ 3 ], paraList[ 4 ], paraList[ 5 ], paraList[ 6 ], paraList[ 7 ]); else : logging.error( "Not support function parameters exceed 8 !" ); sys.exit( 2 ); return ; def extractBlogUser(inputUrl): return callBlogFunc(extractBlogUser, inputUrl); def doPrepareWork(inputUrl): # 2. extract blog user and blog entry url from input url (extractOK, extractedBlogUser, generatedBlogEntryUrl) = extractBlogUser(inputUrl); 另外一个文件BlogBaidu.py中包含对应的所调用的函数: def extractBlogUser(inputUrl): (extractOk, extractedBlogUser, generatedBlogEntryUrl) = ( False , " ", " "); # some code ... return |
运行出错:
Traceback (most recent call last): main(); File "D:\tmp\WordPress\Others\to_wp\BlogsToWordpress\BlogsToWordpress_v2012-03-22-office\BlogsToWordpress_v2012-03-22-office.py", line 1288, in main doPrepareWork(srcURL); File "D:\tmp\WordPress\Others\to_wp\BlogsToWordpress\BlogsToWordpress_v2012-03-22-office\BlogsToWordpress_v2012-03-22-office.py", line 1135, in doPrepareWork (extractOK, extractedBlogUser, generatedBlogEntryUrl) = extractBlogUser(inputUrl); TypeError: ‘NoneType’ object is not iterable |
【解决过程】
1.以为是上面的callBlogFunc的最后的else分支中,只是return而导致的错误呢,所以把:
else :
logging.error("Not support function parameters exceed 8 !");
sys.exit(2);
return;
改为:
else :
logging.error("Not support function parameters exceed 8 !");
sys.exit(2);
return trueFunc(paraList[0]);
结果问题依旧。
2.无意间尝试出来,如果doPrepareWork中,直接调用extractBlogUser是可以的:
extractBlogUser(inputUrl);
但是还是未找到错误原因。
3. 最后才发现,原来是文件BlogBaidu.py中所包含的extractBlogUser,最后是return,没有返回对应的所需要的值,
所以,把BlogBaidu.py中所包含的extractBlogUser的return改为:
return (extractOk, extractedBlogUser, generatedBlogEntryUrl);
就解决了问题了。
【总结】
此处出现:
TypeError: ‘NoneType’ object is not iterable
的原因在于,最终所被调用的函数所返回的值,和返回值赋值给的变量,不匹配。
此处即为,最终所调用的函数是extractBlogUser,其return为空,所以把返回的空的值,赋值给
(extractOK, extractedBlogUser, generatedBlogEntryUrl)
才会出现类型错误TypeError,才会提示NoneType,即extractBlogUser所return回来的None,是not iterable的。
如果再次出现类似错误,那么就去找找你所调用的函数的返回的值的类型,是否和返回值所赋值的变量的类型,两者是否匹配。
转载请注明:在路上 » 【已解决】Python程序错误:TypeError: ‘NoneType’ object is not iterable