【问题】
如下代码: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):
File "D:\tmp\WordPress\Others\to_wp\BlogsToWordpress\BlogsToWordpress_v2012-03-22-office\BlogsToWordpress_v2012-03-22-office.py", line 1389, in
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的。
如果再次出现类似错误,那么就去找找你所调用的函数的返回的值的类型,是否和返回值所赋值的变量的类型,两者是否匹配。