【发布时间】:2018-11-05 11:53:31
【问题描述】:
我是 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 上给出错误,如果我不返回任何内容,它会返回对象的引用并且进一步检查失败。
【问题讨论】:
-
这不是您应该在
__init__级别处理的事情,而是在__new__级别处理。 -
此外
__init__的值无关紧要,python中的大多数__init__s不返回任何东西 -
具体来说,
__init__采用__new__返回的值并将__init__中指定的任何指令应用于该值;__init__返回的任何值都将被丢弃。 -
实例创建是否相同??
garment_loader = GarmentLoader(item=Garment(), response=response, product_id=product_id)像这样??我将如何访问 new 中的 product_id ?? -
此外,对象构造不返回对象的唯一方法是抛出错误。如果
Foo()返回None,我会感到非常惊讶。暂时可能不完全重复但有用:Memoized objects still have their __init__() invoked?
标签: python scrapy scrapy-item