Кисель в АйТи | AI, Python, технологии
3.38K subscribers
156 photos
5 videos
50 links
Я – Александр, и это мой авторский канал, на котором я пишу про AI, разработку и работу в айти.
Download Telegram
Пусть Python и считается самым простым языком для изучения, это не отменяет существования сотен тонкостей и подводных камней.

Так уж у нас прижилось, что .extend() и обычное присваивание некоторые разработчики считают равноценными. Но это ошибка, так как .extend() изменяет существующий список, а сложение создает новый список из двух переданных.

Так же на эту тему есть пара интересных примеров с .extend() и оператором += (украл одолжил с StackOverflow)

Пример №1
list1 = [5, 6]
list2 = [7, 8]

def get_list():
return list1

get_list().extend(list2) # Работает
get_list() += list2 # SyntaxError


Случай редкий, да и визуально может показаться, что всё нормально. Просто вспомним, что такие операторы нельзя использовать с функциями, а так же с объектами, которые не реализуют iadd и add.

Пример №2
my_tuple = ([1, 2], [3, 4], [5, 6])
my_tuple[0].extend([10, 11]) # works
my_tuple[0] += [10, 11] # TypeError


А всё почему? А потому, что`.extend()` изменяет список на месте, а += пытается создать новый список и присвоить его элементу кортежа, что невозможно, так как кортеж — неизменяемый.

#python #разработка
1👍10
Оказывается существует модуль для обнаружения кодировки текста. Называется chardet. Под капотом оно анализирует частотность символов и структуру, находя закономерности, которые есть у разных кодировок.

Использовать максимально просто:

import chardet

# Пример текста в неизвестной кодировке
text_bytes = "Привет, мир!".encode("windows-1251")

# Определение кодировки
result = chardet.detect(text_bytes)

print(result)


Вывод следующий:
{'encoding': 'windows-1251', 'confidence': 0.99, 'language': 'Russian'}


#python
👍9🔥1
Всегда было интересно какой прирост на самом деле дает обновление Python на свежие версии. Будет ли прирост вообще? А может мы просядем в RPS и станет хуже?

Недавно собрался с силами и на коленке собрал бенчмарк на FastAPI. Под капотом реализован CRUD и запуск контейнеров с разными версиями питона. На каждой версии питона выполняется нагрузочное тестирование и сохраняется статистика.

Для большей объективности на каждом эндпоинте выполняются максимально "типичные" операции. Это запись в БД, чтение из файлов, обращения в кэш, расчет каких-либо значений и т.д.

Удалось переиспользовать одни и те же версии пакетов почти везде (были проблемы с 3.8 и 3.13). Так что влияние версий пакетов с различной реализацией внутри - минимально.

И того - Python 3.11 самый быстрый!
А сколько же разговоров было про оптимизации в 3.12 и 3.13...

Выглядит это всё интригующе. Почему 3.11 получился быстрее 3.13?) Надо копать дальше 🤨

#python
5🤔7🔥3
Невероятно, но факт.

Это очень интересный пример "внутренних" оптимизаций питона. Догадаться невозможно - нужно знать.

Многие привыкли, что [:] и вызов конструктора (list()) создают копию объекта. Но если перед нами неизменяемый объект, то всё может быть по другому. Такой объект под видом копирования может вернуть тот же объект, а не копию 🤨

Так же есть интересный пример с frozenset. Мы можем вызвать frozenset.copy() и это вернёт не копию, а всё тот же объект.

#python
11👍9😱1🗿1
Ну что, еще помните для чего нужны __slots__? Про них все слышали, но никто не использует 😅

Идея слотов проста - каждый раз, создавая экземпляр класса питон хранит все объекты в словаре __dict__. У словарей есть свои накладные расходы. А если мы указываем __slots__, то теперь для хранения используются кортежи. Они экономнее и быстрее.

Разница в памяти около 30% на ровном месте. Есть и прирост в скорости создания экземпляров. А так же в скорости доступа к атрибутам.

Есть особенности:
- Слоты не наследуются. У каждого дочернего класса нужно прописывать заново.
- Нельзя динамически добавлять атрибуты в класс
- При указании слотов пропадает поддержка слабых ссылок. Лечится добавлением __weakref__ в слоты вручную.

Но стоит иметь ввиду, что хоть какой то смысл использовать слоты появляется только при наличии большого количества экземпляров.

Простой пример тут

#python
11👍9💯4
В Python 3.14 появились t-строки. Да, мало нам было f-строк. Теперь еще и строки-шаблоны. Для того, чтобы понять зачем они вообще появились стоит вспомнить основной недостаток наших любимых f-строк. По сути всё исходит из невозможности перехватить и дополнительно обработать переданное значение. Всё потому что сразу собирается итоговая строка. А вот t-строка возвращает нам сырой шаблон и мы сами решаем, как его рендерить.

Вот небольшой пример того, как литерал t преобразует строку в объект Template, тем самым давая нам доступ к объекту шаблона:

from string.templatelib import Template

name = "World"
template = t"Hello {name}"
isinstance(template, Template) # 👉 True
print(template.values) # 👉 ("World",)


Рендеринг t-строк выглядит страшновато:
from string.templatelib import Template, Interpolation

def lower_upper(template: Template) -> str:
"""Render static parts lowercased and interpolations uppercased."""
parts: list[str] = []
for item in template:
if isinstance(item, Interpolation):
parts.append(str(item.value).upper())
else:
parts.append(item.lower())
return "".join(parts)

name = "world"
assert lower_upper(t"HELLO {name}") == "hello WORLD"


В голове ноль идей, где бы я мог это применить. Но и особого вреда они тоже не принесут.
Полный текст PEP 750: https://peps.python.org/pep-0750/

#python #python3_14
8🤔3😁1
Еще кое что про Python 3.14. В нём же появился PEP 758. Теперь можно перечислять группу эксепшнов без скобок. Проще показать:

Раньше только так:
try:
...
except (ExceptionA, ExceptionB, ExceptionC):
...


Теперь можно и так:
try:
...
except ExceptionA, ExceptionB, ExceptionC:
...

Полный текст PEP 758: https://peps.python.org/pep-0758/

#python #python3_14
4
А вы знали, что в Python есть группы исключений и возможность зайти в каждый except блок, а не только в первый?

Я об этом узнал совсем недавно. И до сих пор не видел, чтобы кто то такую конструкцию использовал.

try:
raise ExceptionGroup("eg",
[ValueError(1), TypeError(2), OSError(3), OSError(4)])
except* TypeError as e:
print(f'caught {type(e)} with nested {e.exceptions}')
except* OSError as e:
print(f'caught {type(e)} with nested {e.exceptions}')

# caught <class 'ExceptionGroup'> with nested (TypeError(2),)
# caught <class 'ExceptionGroup'> with nested (OSError(3), OSError(4))
# + Exception Group Traceback (most recent call last):
# | File "<stdin>", line 2, in <module>
# | ExceptionGroup: eg
# +-+---------------- 1 ----------------
# | ValueError: 1
# +------------------------------------


Представьте, каких ужасов можно наворотить с неограниченной вложенностью групп исключений. Но если использовать правильно - то весьма наглядно и удобно.

#python #python3_11
1🔥4😱4🤔2
Вышел StackOverflow Survey. Это большой опрос разработчиков с их площадки.
Приложил скриншоты с самыми интересными вопросами. Кое-что интересное конечно же есть.
Вот сам опрос:
https://survey.stackoverflow.co/2025/

Больше всего меня удивляет выборка людей - 27% фулстеков. Их большинство!!!

Vim использует больше людей чем Pycharm 😣 А Cursor скоро войдет в топ-5 IDE по использованию.

По AI предсказуемо - 84% используют AI инструменты.

#python #питон #айти_новости
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍5👏4🤔2
Каким бы не был классным Pydantic, он принёс в Python и кое-что плохое - страх использовать словари. Да, тот самый обычный dict. Ходит слух, что нужно обмазывать весь код моделями со всех сторон (важно ничего не пропустить), чтобы было лучше. Понятнее. Надежнее. Мммм, вкусно.

Зачем нам словарь вообще словари? DEPRECATED! Ни типизации, ни валидации. Никакого контроля! Еще и в отдельный файл не вынести... А если там целых ПЯТЬ ключей, о таком лучше не думать. А вдруг опечатка в названии ключа? А вдруг передадут не тот тип данных? А как мы узнаем какие типы данных нужно передать?

Точно ли это нужно всегда и везде? Сомневаюсь. Когда Я передаю данные СЕБЕ - мне не нужно ничего валидировать. Если я ошибусь - значит я ошибся. Пойду и исправлю. Если без типизации всё непонятно - поверь, главная проблема не в отсутствии моделей.

P.S Совет с пикчи влияет на качество кода даже сильнее, чем Pydantic-модели. Проверено! 😂


🔛 @kisel_it

#python #programming
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍11😁5