Тёмный

ОТКАЖИСЬ от этого в Python | 3 запретных инструмента 

Сурен Хоренян
Подписаться 8 тыс.
Просмотров 3 тыс.
50% 1

Три встроенных в Python инструмента, которые не надо использовать. Эти инструменты вам не нужны. Для решения задач есть альтернативы, тоже встроенные.
Код тут gist.github.com/mahenzon/a99f...
Поддержать выход роликов (зарплата монтажеру)
- на Boosty boosty.to/mahenzon
- на Sponsr sponsr.ru/suren/
- через Tinkoff (любые карты) tinkoff.ru/cf/6kbKWtKhapM
- через CloudTips pay.cloudtips.ru/p/9a8fa641
Ссылки на соцсети:
- Канал в ТГ t.me/Khorenyan - тут в чате обсуждаем технологии и ваш код
- Паблик в ВК SurenKhorenyan
- Дискорд / discord
- RU-vid: / @surenkhorenyan
- Второй канал на RU-vid: / @surenlife
- RuTube rutube.ru/u/Suren/
- Все ссылки taplink.cc/mahenzon
Метки:
00:00 Начало
00:30 Так не делайте, используйте другое
10:03 Это тоже использовать надо, есть же встроенные инструменты
31:20 Вот это точно никогда нельзя использовать, прям совсем
36:45 Спасибо

Наука

Опубликовано:

 

4 июн 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 41   
@BritScientist
@BritScientist 24 дня назад
Вот так, например, можно добавить распаковку: def __iter__(self): return iter((self.x, self.y))
@SurenKhorenyan
@SurenKhorenyan 24 дня назад
Кстати, да! Не подумал о том, что она реально нужна. Всё же это довольно редкий кейс - распаковывать классы в переменные.
@BritScientist
@BritScientist 24 дня назад
@@SurenKhorenyan просто чтобы поддержать возможности интерфейса именованных кортежей, раз речь идет о них.
@SurenKhorenyan
@SurenKhorenyan 24 дня назад
​@@BritScientist в этом плане да, тогда есть смысл 🙂
@MrEligos
@MrEligos 24 дня назад
в dataclasses dataclass используется exec. ну и при создании декоратора класса, в генерации методов, без exec тяжко лямбда тоже для передачи в функцию считаю норм, читается хорошо, сразу понятно, что происходит, ошибки не генирит
@SurenKhorenyan
@SurenKhorenyan 24 дня назад
Что происходит под капотом питона это ок. Я говорю про выполнение этого в нашем коде. Где при создании декоратора нужен exec? Сможете привести пример? Думаю, можно обойтись без exec Лямбда ошибки не генерит, всё так. С ней другая проблема - создание лишней функции, когда уже есть готовая и более быстрая
@catstyle1101
@catstyle1101 24 дня назад
А если во вложенной сортировке надо еще и изменить направление только в одном из параметров? Только лямбда в таком случае?
@SurenKhorenyan
@SurenKhorenyan 23 дня назад
Ага, тут уже оператор не поможет, напор свою функцию писать
@IvaNFallout
@IvaNFallout 24 дня назад
Каждый инструмент хорош в конкретном случае. Не нужно бояться eval, порой без него просто не обойтись, но использовать его нужно с осторожностью, это факт Если инструмент есть, значит он кому-нибудь да понадобится
@user-zx6fq1ig4h
@user-zx6fq1ig4h 24 дня назад
Приведи пример, когда без eval не обойтись
@IvaNFallout
@IvaNFallout 24 дня назад
@@user-zx6fq1ig4hК примеру, на одном из проектов мы храним в БД правила расчета эффективности. Менеджер в любой момент может установить новые правила, от разработчиков не требуется вносить изменения в существующий код приложения и запускать весь процесс ci/cd
@SurenKhorenyan
@SurenKhorenyan 24 дня назад
Пока не знаю ситуаций, где без eval не обойтись. Сможете привести пример? Да, инструменты выполняют свои задачи. И я показываю, что есть более подходящие инструменты для этих же задач
@IvaNFallout
@IvaNFallout 24 дня назад
@@SurenKhorenyan Из личного опыта. Был проект, в котором мы хранили формулы во внешнем хранилище. Было требование от бизнеса, что формулы могут меняться несколько раз в день. Можно было бы придумать механизм расчета таких показателей на стороне СУБД, но sql трудно поддается автоматизированному тестированию и для нас это стало решающим фактором в пользу eval
@SurenKhorenyan
@SurenKhorenyan 23 дня назад
@@IvaNFallout ох, жуткий пример. Уверен, можно было сделать иначе, хотя бы хранимой функцией, ну или инструмент построить для этого. Я бы с удовольствием поработал над такой задачей
@dmitry-lz1ny
@dmitry-lz1ny 24 дня назад
Про operator уже давно не слышал. По моему люди чаще используют генераторы или лямбды. Про скорость я не знаю, возможно оператор даже быстрее. Ну и возможно людям не нравится ещё один импорт тянуть
@SurenKhorenyan
@SurenKhorenyan 24 дня назад
Как генератор может помочь в данном случае? Лямбда работает медленнее оператора, потому что оператор это по сути то же самое, что мы пишем просто как оператор: a + b. А если делать через лямбду, то нужно ещё сначала вызвать функцию, а это занимает время
@saitaro
@saitaro 24 дня назад
Я не думаю, что из-за dataclass теперь не стоит использовать NamedTuple. Во-первых, иногда распаковка прямо требуется, и нет смысла писать костыли для датакласса с перечислением всех атрибутов, которых может быть много. Во-вторых, когда создают кортеж, обычно понимают его свойства сравнения, и равенство двух кортежей разных классов как равенство их атрибутов может быть прямо желательно.
@SurenKhorenyan
@SurenKhorenyan 24 дня назад
Если у вас в распаковке используется много элементов, что-то явно не так.. страшно представить распаковку пяти элементов на одной строчке. А если ошибиться в порядке? Сравнивать два разных типа на равенство и ждать истину вообще какая-то странная идея. Пока из вашего сообщения не представляю реального кейса
@saitaro
@saitaro 24 дня назад
@@SurenKhorenyan Да даже если немного распаковывать, в датаклассе всё равно нужно писать костыль, а зачем, если не нужен его функционал? Для случая сравнения можно представить, что координаты разных типов магазинов хранятся как кортежи разных названий для удобства. Может понадобиться сравнивать просто по координатам и проводить проверку isinstance где-то ещё. Это первое что пришло в голову. Вообще векторы разной природы могут совпадать по координатам, но не по бытовому смыслу.
@SurenKhorenyan
@SurenKhorenyan 23 дня назад
@@saitaro любопытно, но пока не могу для себя представить использование в реальной ситуации
@MAKS19961204
@MAKS19961204 24 дня назад
Неймд тюплы все любят (ну или уже любили, возможно) за их скорость по сравнению с классами. Точно помню такое. Насколько большая разница между неймд тюплом и датаклассом с фрозеном и слотами?
@SurenKhorenyan
@SurenKhorenyan 24 дня назад
По памяти датакласс frozen + slots занимает чуть меньше. По скорости не проверял. А что подразумевается в скорости? Время инициализации?
@MAKS19961204
@MAKS19961204 24 дня назад
@@SurenKhorenyan если память не подводит то да, про инициализацию речь шла. Это хорошо ощутимо на тысячах объектов.
@SurenKhorenyan
@SurenKhorenyan 24 дня назад
@@MAKS19961204 надо будет прочекать. Допускаю, что тюпл действительно быстрее, так как там меньше магии
@progweb3036
@progweb3036 24 дня назад
operator.countOf написан по camelCase, ужас... A на счёт того что нету прямого оператора - заменителя этой функции, я согласен, но у простого списка по моему был метод count с идентичным функционалом
@SurenKhorenyan
@SurenKhorenyan 24 дня назад
Да, наследие старого питона. Угу, такой метод есть, но для этого нужно создать весь список, а это не подходит, так как займёт память
@Kocherga38
@Kocherga38 24 дня назад
Спасибо за видео!
@SurenKhorenyan
@SurenKhorenyan 24 дня назад
Пожалуйста!
@dmitry-lz1ny
@dmitry-lz1ny 24 дня назад
Магия питона прекрасна, но её стоит использовать, когда ты уже понимаешь, как оно там работает. Иначе вы просто закапсулируетесь в питоне и если когда то понадобится что то на другом язык написать, то габела. То есть не нужно игнорировать алгоритмы. Но автор канала сам ролики по алгосам выпускает, то есть это просто пожелание новичкам.
@SurenKhorenyan
@SurenKhorenyan 24 дня назад
Всё так, понимать нужно, но не обязательно сразу закапываться
@dmitry-lz1ny
@dmitry-lz1ny 24 дня назад
@@SurenKhorenyan Не ну если пойдешь в бигтех устраиваться и тем более в яндекс, то там тебя только так алгоритмами задрючат. По моему не так важно на кого ты идешь. Там в любом случае спрашивают алгоритмы. А так на питоне они не сильно актуальны, а вот на более низких языках уже чуть нужнее. К примеру в гошке им найдется применение ибо там почти нет магии.
@SurenKhorenyan
@SurenKhorenyan 24 дня назад
Из крупняков яндекс больше всех и дрючит по алгоритмам, у них там на это пунктик. У других попроще и более приближенные задачи (их тех, с кем я сталкивался). Алгоритмы сильно актуальны на любом языке. Пройти по списку за O(n^2) или O(n)? Существенная разница
@dmitry-lz1ny
@dmitry-lz1ny 24 дня назад
@@SurenKhorenyan Да. В принципе это один из столпов программиста
@user-jw9fx1xk5s
@user-jw9fx1xk5s 24 дня назад
Есть случаи когда без lambda не обойтись. Например в pyqt когда требуется подключить слот с аргументом к сигналу.
@SurenKhorenyan
@SurenKhorenyan 24 дня назад
Там тоже можно без лямбды, я вот делал: github.com/mahenzon/robohand-gui-control/blob/76a325c4468dbd2addaf8e75105fdf89ded40bef/app/widgets/debounced_slider.py#L35
@user-jw9fx1xk5s
@user-jw9fx1xk5s 24 дня назад
@@SurenKhorenyan Это не то). У функции self.slider_changed нет аргументов, а речь о том как передать в функцию self.slider_changed аргументы не вызывая функцию? Такой вариант self.valueChanged.connect(self.slider_changed(arg)) не сработает)
@SurenKhorenyan
@SurenKhorenyan 23 дня назад
@@user-jw9fx1xk5s для этого есть пара разных вариантов: либо делать обёртку типа класса с методом __call__, этот аргумент в __init__ закидывать. Либо через partial просто
@Qustoos
@Qustoos 24 дня назад
Отличное видео!
@SurenKhorenyan
@SurenKhorenyan 24 дня назад
Кайф, спасибо! Рад, что вам понравилось!
Далее
Основы Asyncio
53:25
Просмотров 10 тыс.
OPENSOURCE НЕ БЕЗОПАСЕН? (2024)
17:20
Просмотров 22 тыс.
Мой странный компьютер 2024
18:33
Apple watch hidden camera
0:34
Просмотров 54 млн