Python中的isinstance不按预期工作

1 投票
2 回答
686 浏览
提问于 2025-04-17 23:29

我正在使用 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

这里有两种可能性:

  1. FlexibleItem 其实并不是 TestSpider.spiders.FlexibleItem.FlexibleItem。你需要确认一下,是否有两种方式在导入这个名字。

  2. TestSpider.spiders.FlexibleItem.FlexibleItemRequest 的子类。如果是这样的话,那个 if 语句就会成立,而 elif 语句就永远不会被执行。

1

在这种情况下,要么就是Ignacio说的那样,要么就是问题描述得不太对。

但是为什么第二个条件从来没有变成真呢?我从来没有看到过第二个条件的打印语句。

你确定第二个条件从来没有变成真吗?在 elif isinstance(r, FlexibleItem): 后面加上 1/0 来确认一下。

无论如何,想要了解发生了什么,使用调试工具是个更好的办法。在第一个 if 之前加上 import pdb; pdb.set_trace(),这样可以一步一步运行脚本,看看到底发生了什么。

撰写回答