LINUX.ORG.RU

Safely iterating over WeakKeyDictionary and WeakValueDictionary

 


0

1

Интернеты пишут:

It is actually safe to iterate over a WeakKeyDictionary, WeakValueDictionary, or WeakSet in Python 2.7 or Python 3.1+. They put in an iteration guard that prevents weakref callbacks from removing references from the underlying dict or set during iteration all the way back in 2010, but the docs never got updated.

With the guard in, if an entry dies before iteration reaches it, iteration will skip that entry, but it won’t result in a segfault or a RuntimeError or anything. Dead entries will be added to a list of pending removals and handled later.

Мда? Это, мять, тогда что?!

  File "/root/src/Site/SiteHelpers.py", line 84, in processReqs
    for key, req in self.peer_reqs.items():
  File "/usr/lib/python3.8/weakref.py", line 208, in items
    for k, wr in self.data.items():
RuntimeError: dictionary changed size during iteration

Не верьте интернетам.

Вариант с for k,v in list(d.items()) тоже не прокатит. На последней итерации сборщик мусора может хлопнуть list() и следом начать удалять слабые ссылки из словаря.

list() нужно хранить отдельно на протяжении итерирования:

items = list(d.items())
for k,v in items:

Чем больше я пишу на питоне, тем сильнее ненавижу разработчиков.

PHP и Python это просто какие-то наглядные образцы, «как нельзя проектировать ЯП».

После них JS и Ruby кажутся вершинами эволюции.

wandrien ★★
() автор топика

WeakKeyDictionary and WeakValueDictionary

Что это? как их получить? сам себе стреляешь в ногу и жалуешься что больно

eternal_sorrow ★★★★★
()
Последнее исправление: eternal_sorrow (всего исправлений: 1)
Ответ на: комментарий от wandrien

Ruby тормоз, js… я не понимаю как ты можешь спокойно на нем писать и к тебе не приходят кровавые мальчики по ночам. Т.е. я понимаю что для веб фронта альтернатив особо нет, но писать на нем добровольно…

cobold ★★★★★
()
Ответ на: комментарий от wandrien

PHP и Python это просто какие-то наглядные образцы, «как нельзя проектировать ЯП»

Да ^_^

Справедливости ради, эти языки никогда не проектировались. Как и та же сишка. Но индустрия настолько бессмысленна и беспощадна — она почему-то считает, что чем больше костылей в инструменте — тем этот инструмент круче. Воспомни, та же сишка уже со старта была совместимостью с совместимостью, грудой костылей-надстроек над старыми решениями. Питон в самом первом релизе 1991 года уже был кучей случайных натасканных с других языков фич. Пых вообще был шаблонизатором и формочкой для администрирования бложыка — весь ЯП был на него сверху накостылен уже комьюнитем. Сам Расмус стебался «новый PHP стал лучше, потому что в нем стало меньше моего кода» и «все PHP фреймворки — говно».

byko3y ★★★★
()
Ответ на: комментарий от cobold

js… я не понимаю как ты можешь спокойно на нем писать и к тебе не приходят кровавые мальчики по ночам. Т.е. я понимаю что для веб фронта альтернатив особо нет, но писать на нем добровольно

Подмножество JS с фичами ES2015 и позже вполне себе терпимо. То есть:
 — никаких операторов «==», только «===»;
 — наконец добавили штатные проверки на NaN и Infinity вместо костылей с (typeof v === "number" && v === v && v !== Infinity && v !== -Infinity);
 — форматирование строк только через ``, никаких складываний;
 — НОРМАЛЬНЫЕ МОДУЛИ;
 — никаких классов-наследований;
 — только «let» и «const», никаких «var»;
 — rest/spread syntax, деструктурирующее присваивание и деструктурирующая передача аргументов вместо старых муток со slice, concat, arguments, или просто груды копипасты;
 — нормальные циклы for (... of ...) вместо специальных конструкций под каждый тип данных;
 — промисы. Не самое лучшее решение, но это лучше, чем старые колобки.

byko3y ★★★★
()

Если это так, может стоит запостить багрепорт, а не ныть на форуме?

mxfm ★★
()

А можно больше контекста? Например как ты формируешь словарь? Какого типа ключи и значения? Прост выглядит так, словно ты специально делаешь что-то неправильно и жалуешься, что не работает.

Aswed ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.