Size: a a a

2020 December 09

D

Dmitry in Scrapy
Наберите воздуха.
источник

D

Dmitry in Scrapy
class A:
   def __init__(self) -> None:
       self.b = B()


class B:
   def __init__(self) -> None:
       self.name = "old"
источник

D

Dmitry in Scrapy
def start_requests(self):
       self.a = A()
       yield scrapy.Request("http://ya.ru", cb_kwargs={'b': self.a.b})

def parse(self, response, b):
       b.name = 'new'
       logger.info(self.a.b.name)
источник

D

Dmitry in Scrapy
Что выведет скрапи? :)
источник

К

Кирилл in Scrapy
и что же?
источник

D

Dmitry in Scrapy
Сначала требую ответа от экспертов :)
источник

D

Dmitry in Scrapy
Ну вот, никому не интересно? :(
источник

D

Dmitrij in Scrapy
old?
источник

D

Dmitry in Scrapy
Ответ it depends! Виндовый стэк выдает new, а линуксовый old (можно проверить на scrapy cloud) 🤯
источник

D

Dmitrij in Scrapy
Интересно. А почему так?
источник

D

Dmitry in Scrapy
Мне вот тоже интересно. Scrapy 2.4.1 и там и там, на всякий.
источник

Ra

Ruslan aka DUDE in Scrapy
Выведи id(self.a.b) после self.a = A()
И id(b) после b.name = 'new'
источник

Ra

Ruslan aka DUDE in Scrapy
На линуксе и на винде
источник

D

Dmitry in Scrapy
Ruslan aka DUDE
Выведи id(self.a.b) после self.a = A()
И id(b) после b.name = 'new'
На винде одинаковые. На линухе разные
источник

D

Dmitrij in Scrapy
Ну это понятно, на Линуксе передалась в парс копия объекта, а на винде ссылка именно на тот же объект в памяти. Но вопрос почему так - открыт
источник

D

Dmitrij in Scrapy
Может это как то связано с тем, как реализовано распараллеливание парсинга в винде и Линуксе
источник

D

Dmitry in Scrapy
Завтра @wrar42 проснется - объяснит :)
источник

Ra

Ruslan aka DUDE in Scrapy
Это поведение меняет сам scrapy т.к. без него передается копия
как принудительно передать копию я видел
а как принудительно заставить передать ссылку - не встречал
источник

AR

Andrey Rahmatullin in Scrapy
А, лол
источник

AR

Andrey Rahmatullin in Scrapy
Я думаю дело в мемори/диск очередях
источник