如何不从__init__返回对象引用

时间:2018-11-05 11:53:31

标签: python scrapy scrapy-item

我是ItemLoaders的新手。 我有一个seen_ids集合,其中添加了所有我抓取的product_ids,以便可以检查是否有重复项并尽早跳过。

问题是,我想在__init__中这样做。如果重复,则不希望返回任何引用,也不能从__init__显式返回None。我该怎么办?

seen_ids = set()

def __init__(self, item=None, selector=None, response=None, parent=None, product_id=None, **context):
    if product_id in self.seen_ids:
        return None

    self.seen_ids.add(product_id)
    super(GarmentLoader, self).__init__(item, selector, response, parent, **context)
    item['retailer_sku'] = product_id

但是它在None上给出了错误,如果我不返回任何内容,它将返回对象的引用,并且进一步检查失败。

1 个答案:

答案 0 :(得分:0)

这是行不通的,因为构造函数除了实例以外基本上不返回任何东西,并且因为实例不会共享seen_id。

您可以改用类方法:

class CustomItemLoader(ItemLoader):
    seen_ids = set()

    @classmethod
    def with_product_id(cls, **kwargs):
        product_id = kwargs.pop('product_id', None)
        if product_id in cls.seen_ids:
            return None
        cls.seen_ids.add(product_id)
        return cls(**kwargs)

然后使用它创建加载器的实例:

loader = CustomItemLoader.with_product_id(response=response, product_id=product_id, ...)