我是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上给出了错误,如果我不返回任何内容,它将返回对象的引用,并且进一步检查失败。
答案 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, ...)