🔍 Что пошло не так? Почему 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 and Signal Havens for Right-Wing Extremists
Since the violent storming of Capitol Hill and subsequent ban of former U.S. President Donald Trump from Facebook and Twitter, the removal of Parler from Amazon’s servers, and the de-platforming of incendiary right-wing content, messaging services Telegram and Signal have seen a deluge of new users. In January alone, Telegram reported 90 million new accounts. Its founder, Pavel Durov, described this as “the largest digital migration in human history.” Signal reportedly doubled its user base to 40 million people and became the most downloaded app in 70 countries. The two services rely on encryption to protect the privacy of user communication, which has made them popular with protesters seeking to conceal their identities against repressive governments in places like Belarus, Hong Kong, and Iran. But the same encryption technology has also made them a favored communication tool for criminals and terrorist groups, including al Qaeda and the Islamic State.