🔍 Что пошло не так? Почему 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 + инициализацию внутри функции для изменяемых типов.
Bitcoin is built on a distributed digital record called a blockchain. As the name implies, blockchain is a linked body of data, made up of units called blocks that contain information about each and every transaction, including date and time, total value, buyer and seller, and a unique identifying code for each exchange. Entries are strung together in chronological order, creating a digital chain of blocks. “Once a block is added to the blockchain, it becomes accessible to anyone who wishes to view it, acting as a public ledger of cryptocurrency transactions,” says Stacey Harris, consultant for Pelicoin, a network of cryptocurrency ATMs. Blockchain is decentralized, which means it’s not controlled by any one organization. “It’s like a Google Doc that anyone can work on,” says Buchi Okoro, CEO and co-founder of African cryptocurrency exchange Quidax. “Nobody owns it, but anyone who has a link can contribute to it. And as different people update it, your copy also gets updated.”
Telegram Gives Up On Crypto Blockchain Project
Durov said on his Telegram channel today that the two and a half year blockchain and crypto project has been put to sleep. Ironically, after leaving Russia because the government wanted his encryption keys to his social media firm, Durov’s cryptocurrency idea lost steam because of a U.S. court. “The technology we created allowed for an open, free, decentralized exchange of value and ideas. TON had the potential to revolutionize how people store and transfer funds and information,” he wrote on his channel. “Unfortunately, a U.S. court stopped TON from happening.”