🔍 Что пошло не так? Почему code: 500 появляется там, где его быть не должно?
🧩Задача:
1. Найди и объясни источник бага 2. Почему Python не выбрасывает ошибку? 3. Как проверить, что дефолтный аргумент сохраняет состояние между вызовами? 4. Как это исправить безопасно и "по питоновски"? 5. Где ещё может проявиться аналогичный эффект?
🛠Разбор и решение:
🔸Причина: Изменяемое значение (`dict`) используется как значение по умолчанию. В Python значения по умолчанию вычисляются один раз при определении функции, а не при каждом вызове.
То есть metadata={} создаётся один раз и сохраняется между вызовами, если параметр не передан.
🔸Проверка:
def f(d={}): print(id(d)) d["x"] = 1 print(d)
f() f()
Вы увидишь одинаковые id(d) — значит, используется тот же объект.
🔸Решение (правильный способ):
def log_event(event, metadata=None): if metadata is None: metadata = {} metadata["event"] = event print(metadata)
Теперь при каждом вызове создаётся новый словарь, и code: 500 не "протекает" в следующие вызовы.
🔸Где ещё встречается: - Списки: items=[] - Множества: visited=set() - Объекты пользовательских классов
📌Вывод: Изменяемые значения по умолчанию — одна из самых частых ошибок в Python. Она не вызывает исключений, но может незаметно повредить данные. Всегда используй None + инициализацию внутри функции для изменяемых типов.
🔍 Что пошло не так? Почему code: 500 появляется там, где его быть не должно?
🧩Задача:
1. Найди и объясни источник бага 2. Почему Python не выбрасывает ошибку? 3. Как проверить, что дефолтный аргумент сохраняет состояние между вызовами? 4. Как это исправить безопасно и "по питоновски"? 5. Где ещё может проявиться аналогичный эффект?
🛠Разбор и решение:
🔸Причина: Изменяемое значение (`dict`) используется как значение по умолчанию. В Python значения по умолчанию вычисляются один раз при определении функции, а не при каждом вызове.
То есть metadata={} создаётся один раз и сохраняется между вызовами, если параметр не передан.
🔸Проверка:
def f(d={}): print(id(d)) d["x"] = 1 print(d)
f() f()
Вы увидишь одинаковые id(d) — значит, используется тот же объект.
🔸Решение (правильный способ):
def log_event(event, metadata=None): if metadata is None: metadata = {} metadata["event"] = event print(metadata)
Теперь при каждом вызове создаётся новый словарь, и code: 500 не "протекает" в следующие вызовы.
🔸Где ещё встречается: - Списки: items=[] - Множества: visited=set() - Объекты пользовательских классов
📌Вывод: Изменяемые значения по умолчанию — одна из самых частых ошибок в Python. Она не вызывает исключений, но может незаметно повредить данные. Всегда используй None + инициализацию внутри функции для изменяемых типов.
These entities are reportedly operating nine Telegram channels with more than five million subscribers to whom they were making recommendations on selected listed scrips. Such recommendations induced the investors to deal in the said scrips, thereby creating artificial volume and price rise. Right now the digital security needs of Russians and Ukrainians are very different, and they lead to very different caveats about how to mitigate the risks associated with using Telegram. For Ukrainians in Ukraine, whose physical safety is at risk because they are in a war zone, digital security is probably not their highest priority. They may value access to news and communication with their loved ones over making sure that all of their communications are encrypted in such a manner that they are indecipherable to Telegram, its employees, or governments with court orders. He said that since his platform does not have the capacity to check all channels, it may restrict some in Russia and Ukraine "for the duration of the conflict," but then reversed course hours later after many users complained that Telegram was an important source of information. Soloviev also promoted the channel in a post he shared on his own Telegram, which has 580,000 followers. The post recommended his viewers subscribe to "War on Fakes" in a time of fake news. DFR Lab sent the image through Microsoft Azure's Face Verification program and found that it was "highly unlikely" that the person in the second photo was the same as the first woman. The fact-checker Logically AI also found the claim to be false. The woman, Olena Kurilo, was also captured in a video after the airstrike and shown to have the injuries.
from us