Как не вернуть ссылку на объект из __init__ - PullRequest
0 голосов
/ 05 ноября 2018

Я новичок в ItemLoaders. У меня есть набор seen_ids, в который я добавляю все product_ids, которые я очищаю, чтобы я мог проверить, есть ли дубликаты, и пропустить его в ближайшее время.

Проблема в том, что я хочу сделать это в __init__. Если это дубликат, я не хочу, чтобы какая-либо ссылка возвращалась, и я не могу явно вернуть None из __init__. Как бы я это сделал?

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 голосов
/ 06 ноября 2018

Это не сработает, потому что конструктор в основном не возвращает ничего, кроме экземпляра, и потому что экземпляры не будут совместно использовать seen_ids.

Вместо этого вы можете использовать метод класса:

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, ...)
...