python isinstance没有按预期工作

时间:2014-03-23 05:10:14

标签: python python-2.7 scrapy

我正在使用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的类型,我的cmd上的结果是:

r type = <class 'TestSpider.spiders.FlexibleItem.FlexibleItem'>

所以类型是FlexibleItem

但为什么第二个条件永远不会成真?我从未见过第二个条件的打印声明

修改

此图片适合现在正在帮助我的善良用户。

enter image description here

2 个答案:

答案 0 :(得分:1)

在这种情况下,它是Ignacio所说的,或者问题的描述不正确。

  

但为什么第二个条件永远不会成真?我从来没见过   来自第二个条件的打印声明

你确定第二个条件永远不会成真吗?将1/0放在elif isinstance(r, FlexibleItem):之后,以确定它。

在任何情况下,找出正在发生的事情的更好方法是使用调试器。将import pdb; pdb.set_trace()放在第一个if之前将允许逐步运行脚本并查看发生的情况。

答案 1 :(得分:1)

有两种可能性:

  1. FlexibleItem实际上不是TestSpider.spiders.FlexibleItem.FlexibleItem。确保没有两种方法可以导入名称。

  2. TestSpider.spiders.FlexibleItem.FlexibleItemRequest的后代。如果是这种情况,则if语句将为true,并且永远不会评估elif语句。