Python中的isinstance不按预期工作
我正在使用 scrapy 0.20 和 python 2.7
这是我的代码
def process_spider_output(self, response, result, spider):
print 'process_spider_output'
for r in result:
print 'r type = {0}'.format(type(r))
if isinstance(r, Request):
key = self._get_key(r)
if self.db.has_key(key):
spider.log("Ignoring already visited: %s" % r, level=log.INFO)
print 'Ignoring already visited: {0}'.format(r)
continue
elif isinstance(r, FlexibleItem):
key = self._get_key(response.request)
self.db[key] = str(time.time())
spider.log("Writing to log: %s" % key, level=log.INFO)
print 'Writing to log {0}'.format(s)
yield r
我想打印出 r
的类型,结果在我的命令行上显示:
r type = <class 'TestSpider.spiders.FlexibleItem.FlexibleItem'>
所以类型是 FlexibleItem
但是为什么第二个条件从来没有变成真呢?我从来没有看到第二个条件的打印语句
编辑
这张图片是给现在帮助我的好心用户的。
2 个回答
1
这里有两种可能性:
FlexibleItem
其实并不是TestSpider.spiders.FlexibleItem.FlexibleItem
。你需要确认一下,是否有两种方式在导入这个名字。TestSpider.spiders.FlexibleItem.FlexibleItem
是Request
的子类。如果是这样的话,那个if
语句就会成立,而elif
语句就永远不会被执行。
1
在这种情况下,要么就是Ignacio说的那样,要么就是问题描述得不太对。
但是为什么第二个条件从来没有变成真呢?我从来没有看到过第二个条件的打印语句。
你确定第二个条件从来没有变成真吗?在 elif isinstance(r, FlexibleItem):
后面加上 1/0
来确认一下。
无论如何,想要了解发生了什么,使用调试工具是个更好的办法。在第一个 if
之前加上 import pdb; pdb.set_trace()
,这样可以一步一步运行脚本,看看到底发生了什么。