В Python 3.15 появится полноценный иммутабельный словарь.
В модуль builtins добавляется новый публичный неизменяемый тип frozendict.
Ожидается, что
Зачем это вообще нужно:
▪️ Хочешь использовать мапу как ключ в другом
▪️
▪️ Дефолты в аргументах функций: вместо “мутабельного дефолта” можно давать
Как выглядит по API:
▪️ Конструктор “как у dict”:
▪️ Порядок вставки сохраняется (как в обычном
▪️ Хэш не зависит от порядка элементов (логика через
▪️ Есть объединение через
▪️
Важный момент:
И бонус для stdlib: авторы наметили места, где можно заменить константные/публичные мапы на
👉 @PythonPortal
В модуль builtins добавляется новый публичный неизменяемый тип frozendict.
Ожидается, что
frozendict будет “safe by design”, потому что он предотвращает любые непреднамеренные изменения. Это полезно не только для стандартной библиотеки CPython, но и для сторонних мейнтейнеров: можно опираться на надежный неизменяемый тип словаря.Зачем это вообще нужно:
dict или засунуть в set? Обычный dict нельзя, а frozendict можно (если значения тоже хэшируемые). @functools.lru_cache() и аргументы-словари: с dict будет сложно, с frozendict нормально. frozendict(...) и не ловить сюрпризы. Как выглядит по API:
frozendict(), frozendict(**kwargs), frozendict(mapping) или iterable пар, плюс можно смешивать с **kwargs. dict). frozenset(items)), и сравнение тоже по содержимому, а не по порядку. | и “обновление” |= (но |= не мутирует объект, а создает новый). .copy() в CPython по сути возвращает тот же объект (shallow), а если надо глубоко, то copy.deepcopy(). Важный момент:
frozendict НЕ наследуется от dict. Это специально, чтобы нельзя было обойти “неизменяемость” вызовом dict.__setitem__ и подобных трюков. И бонус для stdlib: авторы наметили места, где можно заменить константные/публичные мапы на
frozendict (в том числе там, где сейчас MappingProxyType). Please open Telegram to view this post
VIEW IN TELEGRAM
Python Enhancement Proposals (PEPs)
PEP 814 – Add frozendict built-in type | peps.python.org
A new public immutable type frozendict is added to the builtins module.
👍16❤6
Разраб придумал гениальную капчу против ИИ-агентов: чтобы записаться к нему на созвон, нужно 10 раз громко сказать «NIGGA».
👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
😁43🤣19🤯3🔥1
Посмотрим как ты знаешь классы в Python 🤩
Вопрос по Python:
Какой будет вывод у этого кода и почему?
👉 @PythonPortal
Вопрос по Python:
Какой будет вывод у этого кода и почему?
Please open Telegram to view this post
VIEW IN TELEGRAM
❤19👍11🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
Этот тул умеет скачивать буквально что угодно по ссылке
100% бесплатно. опенсорс. без рекламы.
https://cobalt.tools/
👉 @PythonPortal
100% бесплатно. опенсорс. без рекламы.
https://cobalt.tools/
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯10👍5❤2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁38🔥7
This media is not supported in your browser
VIEW IN TELEGRAM
Делюсь этим Python-скриптом под OSINT: это простая, но полезная штука для расследований по возможным группам киберпреступности, потому что она позволяет в реальном времени логировать статусы присутствия в Telegram. Мониторинг определяет такие состояния:
- В СЕТИ
- БЫЛ(А)
- БЫЛ(А) НЕДАВНО
- БЫЛ(А) НА ЭТОЙ НЕДЕЛЕ
- БЫЛ(А) В ЭТОМ МЕСЯЦЕ
- БЫЛ(А) ОЧЕНЬ ДАВНО
- СТАТУС НЕИЗВЕСТЕН
Хотя это только видимые метаданные, анализ временных паттернов может помочь заметить синхронные всплески активности, возможные смены между аккаунтами, повторное использование профилей или профили, которые выглядят разными, но ведут себя синхронно.
Бот может работать по запросу (через кнопку проверки), но его также можно доработать под мониторинг изменений в реальном времени, логирование переходов статусов и авто-алерты, когда аккаунт становится В СЕТИ или меняет паттерн активности. Это позволяет заранее видеть операционные пики, выявлять неактивные или приманочные аккаунты и усиливать стратегический анализ, строго в рамках закона и для легитимных целей исследования.
👉 @PythonPortal
- В СЕТИ
- БЫЛ(А)
- БЫЛ(А) НЕДАВНО
- БЫЛ(А) НА ЭТОЙ НЕДЕЛЕ
- БЫЛ(А) В ЭТОМ МЕСЯЦЕ
- БЫЛ(А) ОЧЕНЬ ДАВНО
- СТАТУС НЕИЗВЕСТЕН
Хотя это только видимые метаданные, анализ временных паттернов может помочь заметить синхронные всплески активности, возможные смены между аккаунтами, повторное использование профилей или профили, которые выглядят разными, но ведут себя синхронно.
Бот может работать по запросу (через кнопку проверки), но его также можно доработать под мониторинг изменений в реальном времени, логирование переходов статусов и авто-алерты, когда аккаунт становится В СЕТИ или меняет паттерн активности. Это позволяет заранее видеть операционные пики, выявлять неактивные или приманочные аккаунты и усиливать стратегический анализ, строго в рамках закона и для легитимных целей исследования.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤7🔥5
Некоторые SQL-грабли, на которые до сих пор наступают даже сеньоры (мне тоже иногда приходится лезть в доки и перепроверять):
1.
2.
3.
4.
5.
👉 @PythonPortal
1.
= NULL никогда не бывает true. Используй IS NULL / IS NOT NULL (трехзначная логика: true, false, unknown).2.
NOT IN (...) + один NULL в списке может вернуть ноль строк. Чаще безопаснее NOT EXISTS.3.
LEFT JOIN + фильтр в WHERE превращается в INNER JOIN. Фильтры по джойну клади в ON.4.
COUNT(col) пропускает NULL, а COUNT(*) нет. Из-за этого метрики потом “магически” не сходятся.5.
NULL ломает конкатенацию и сравнения. Используй COALESCE осознанно.Please open Telegram to view this post
VIEW IN TELEGRAM
👍34❤13
Немного базы Python:
Когда вы проходите циклом по итерируемому объекту, функция
В примере ниже обратите внимание на пробел между кавычками (
У
👉 @PythonPortal
print по горизонталиКогда вы проходите циклом по итерируемому объекту, функция
print печатает каждый элемент с новой строки. Это потому, что у print есть параметр end. По умолчанию значение этого параметра содержит символ перевода строки (end="\n"). Чтобы печатать в одну строку, нужно убрать перевод строки и заменить его на пустую строку (end="").В примере ниже обратите внимание на пробел между кавычками (
" "): он нужен, чтобы числа печатались с пробелами между ними. Если убрать пробел (""), числа выведутся слитно, вот так: 1367. Вот код, который это показывает:In [1]: my_list = [1, 3, 6, 7]
for number in my_list:
print(number, end=" ")
// 1 3 6 7
У
print есть еще один параметр: sep. Мы используем sep, чтобы задать, чем разделять выводимые значения. Ниже в качестве разделителя используется символ /:In [2]: print('12', '12', '1990', sep='/')
// 12/12/1990Please open Telegram to view this post
VIEW IN TELEGRAM
👍24❤8🤯3
Если ты только начинаешь с Python, остановись и внимательно посмотри
Не меняй список во время прохода по нему.
Когда ты модифицируешь список прямо во время итерации, итератор начинает путаться. Он не “знает”, что список изменился прямо у него под ногами.
Например, этот код сломан:
Здесь мы используем
Лучший способ сделать это: итерироваться по копии:
Когда ты проходишь по копии (поверхностной копии), индексы в исходной копии не меняются.
Еще лучше использовать list comprehension:
Никогда, ни при каких условиях не модифицируй список (или любую коллекцию) прямо во время итерации по нему. Итератор плохо переносит структурные изменения: он может пропускать элементы, обрабатывать один и тот же элемент дважды или (в некоторых случаях, например со словарями) выбрасывать
👉 @PythonPortal
Не меняй список во время прохода по нему.
Когда ты модифицируешь список прямо во время итерации, итератор начинает путаться. Он не “знает”, что список изменился прямо у него под ногами.
Например, этот код сломан:
items = [1, 2, 2, 3, 4]
for item in items:
if item == 2:
items.remove(item)
print(items)
# Output: [1, 2, 3, 4]
Здесь мы используем
remove(), чтобы удалить все двойки из списка. Но если посмотреть на вывод, одна 2 все равно осталась. Почему так происходит: когда ты удаляешь элемент из списка, все элементы справа сдвигаются влево. А цикл продолжает идти дальше. В итоге происходит вот что: находится и удаляется первая 2. Вторая 2 сдвигается на ее место. Цикл переходит к следующему индексу и пропускает эту 2.Лучший способ сделать это: итерироваться по копии:
for item in items[:]:
if item == 2:
items.remove(item)
print(items)
# Output: [1, 3, 4]
Когда ты проходишь по копии (поверхностной копии), индексы в исходной копии не меняются.
Еще лучше использовать list comprehension:
items = [x for x in items if x != 2]
Никогда, ни при каких условиях не модифицируй список (или любую коллекцию) прямо во время итерации по нему. Итератор плохо переносит структурные изменения: он может пропускать элементы, обрабатывать один и тот же элемент дважды или (в некоторых случаях, например со словарями) выбрасывать
RuntimeError. Это плохая практика.Please open Telegram to view this post
VIEW IN TELEGRAM
❤27👍14🔥6🤣1
Google раздал шума: в Chrome выкатили ранний превью WebMCP, и это приподносят как замену веб-скрейпингу
Теперь любой сайт может стать нативным инструментом для AI-агентов.😶
👉 @PythonPortal
Теперь любой сайт может стать нативным инструментом для AI-агентов.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯21❤9🤔1😢1
Немного базы Python. День 2: cлияние словарей
Если у тебя есть два словаря, которые нужно объединить, это можно сделать двумя простыми способами. Можно использовать оператор merge (
1️⃣ Использование оператора merge (
Вывод:
2️⃣ Метод 2: использование оператора merge (
С этим оператором нужно поместить словари внутрь фигурных скобок. В коде ниже мы “подставляем” два словаря для объединения с помощью двух операторов
Вывод:
👉 @PythonPortal
Если у тебя есть два словаря, которые нужно объединить, это можно сделать двумя простыми способами. Можно использовать оператор merge (
|) или оператор (**). Ниже у нас есть два словаря: first_dict и second_dict. Мы будем использовать эти два метода, чтобы объединить словари. Вот код:|)first_dict = {"kelly": 23,
"Derick": 14, "John": 7}
second_dict = {"Ravi": 45, "Mpho": 67}
combined_dict = first_dict | second_dict
print(combined_dict)Вывод:
{'kelly': 23, 'Derick': 14, 'John': 7, 'Ravi': 45, 'Mpho': 67}**)С этим оператором нужно поместить словари внутрь фигурных скобок. В коде ниже мы “подставляем” два словаря для объединения с помощью двух операторов
*. Оба словаря заключены в фигурные скобки и разделены запятой.first_dict = {"kelly": 23,
"Derick": 14, "John": 7}
second_dict = {"Ravi": 45, "Mpho": 67}
combined_dict = {**first_dict, **second_dict}
print(combined_dict)Вывод:
{'kelly': 23, 'Derick': 14, 'John': 7, 'Ravi': 45, 'Mpho': 67}Please open Telegram to view this post
VIEW IN TELEGRAM
❤28👍8🔥3🤝1
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣51😁4
На Stepik добавили курс «Linux с нуля»
Этот курс закрывает всю обязательную Linux-базу для работы в IT. Подойдёт для:
Внутри 20+ модулей: от установки Linux и работы с файлами до сетей, прав, дисков, процессов, автоматизации на Bash и многого другого. Всё сразу закрепляется на практике (200+ заданий с автопроверкой)
Материал подаётся понятным языком, шаг за шагом, на реальных примерах и с наглядными схемами
После прохождения вы получите сертификат, который можно добавить в резюме.
В ближайшие 48ч курс доступен со скидкой 30% по промокоду «
Этот курс закрывает всю обязательную Linux-базу для работы в IT. Подойдёт для:
- разработчиков
- девопсов и админов
- специалистов по данным и ML
- специалистов поддержки и сопровождения
- тестировщиков и безопасников
Внутри 20+ модулей: от установки Linux и работы с файлами до сетей, прав, дисков, процессов, автоматизации на Bash и многого другого. Всё сразу закрепляется на практике (200+ заданий с автопроверкой)
Материал подаётся понятным языком, шаг за шагом, на реальных примерах и с наглядными схемами
После прохождения вы получите сертификат, который можно добавить в резюме.
В ближайшие 48ч курс доступен со скидкой 30% по промокоду «
23LINUX30»: открыть курс на Stepik🤔6❤3😁1🌚1🤣1
Ускорь JSON-ответы FastAPI в 2 раза, а то и больше
1. Обновись до только что вышедшего FastAPI 0.131.0
2. Объявляй response model (тип возврата)
После этого🦀
https://fastapi.tiangolo.com/advanced/custom-response/#json-performance
👉 @PythonPortal
1. Обновись до только что вышедшего FastAPI 0.131.0
2. Объявляй response model (тип возврата)
После этого
@pydantic будет заниматься JSON-сериализацией на стороне Rust https://fastapi.tiangolo.com/advanced/custom-response/#json-performance
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤1🔥1🌚1