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

Ғылым және технология

Три встроенных в 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
- KZread: / @surenkhorenyan
- Второй канал на KZread: / @surenlife
- RuTube rutube.ru/u/Suren/
- Все ссылки taplink.cc/mahenzon
Метки:
00:00 Начало
00:30 Так не делайте, используйте другое
10:03 Это тоже использовать надо, есть же встроенные инструменты
31:20 Вот это точно никогда нельзя использовать, прям совсем
36:45 Спасибо

Пікірлер: 41

  • @BritScientist
    @BritScientist26 күн бұрын

    Вот так, например, можно добавить распаковку: def __iter__(self): return iter((self.x, self.y))

  • @SurenKhorenyan

    @SurenKhorenyan

    26 күн бұрын

    Кстати, да! Не подумал о том, что она реально нужна. Всё же это довольно редкий кейс - распаковывать классы в переменные.

  • @BritScientist

    @BritScientist

    26 күн бұрын

    @@SurenKhorenyan просто чтобы поддержать возможности интерфейса именованных кортежей, раз речь идет о них.

  • @SurenKhorenyan

    @SurenKhorenyan

    26 күн бұрын

    ​@@BritScientist в этом плане да, тогда есть смысл 🙂

  • @catstyle1101
    @catstyle110126 күн бұрын

    А если во вложенной сортировке надо еще и изменить направление только в одном из параметров? Только лямбда в таком случае?

  • @SurenKhorenyan

    @SurenKhorenyan

    26 күн бұрын

    Ага, тут уже оператор не поможет, напор свою функцию писать

  • @MrEligos
    @MrEligos26 күн бұрын

    в dataclasses dataclass используется exec. ну и при создании декоратора класса, в генерации методов, без exec тяжко лямбда тоже для передачи в функцию считаю норм, читается хорошо, сразу понятно, что происходит, ошибки не генирит

  • @SurenKhorenyan

    @SurenKhorenyan

    26 күн бұрын

    Что происходит под капотом питона это ок. Я говорю про выполнение этого в нашем коде. Где при создании декоратора нужен exec? Сможете привести пример? Думаю, можно обойтись без exec Лямбда ошибки не генерит, всё так. С ней другая проблема - создание лишней функции, когда уже есть готовая и более быстрая

  • @saitaro
    @saitaro26 күн бұрын

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

  • @SurenKhorenyan

    @SurenKhorenyan

    26 күн бұрын

    Если у вас в распаковке используется много элементов, что-то явно не так.. страшно представить распаковку пяти элементов на одной строчке. А если ошибиться в порядке? Сравнивать два разных типа на равенство и ждать истину вообще какая-то странная идея. Пока из вашего сообщения не представляю реального кейса

  • @saitaro

    @saitaro

    26 күн бұрын

    @@SurenKhorenyan Да даже если немного распаковывать, в датаклассе всё равно нужно писать костыль, а зачем, если не нужен его функционал? Для случая сравнения можно представить, что координаты разных типов магазинов хранятся как кортежи разных названий для удобства. Может понадобиться сравнивать просто по координатам и проводить проверку isinstance где-то ещё. Это первое что пришло в голову. Вообще векторы разной природы могут совпадать по координатам, но не по бытовому смыслу.

  • @SurenKhorenyan

    @SurenKhorenyan

    26 күн бұрын

    @@saitaro любопытно, но пока не могу для себя представить использование в реальной ситуации

  • @IvaNFallout
    @IvaNFallout26 күн бұрын

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

  • @user-zx6fq1ig4h

    @user-zx6fq1ig4h

    26 күн бұрын

    Приведи пример, когда без eval не обойтись

  • @IvaNFallout

    @IvaNFallout

    26 күн бұрын

    @@user-zx6fq1ig4hК примеру, на одном из проектов мы храним в БД правила расчета эффективности. Менеджер в любой момент может установить новые правила, от разработчиков не требуется вносить изменения в существующий код приложения и запускать весь процесс ci/cd

  • @SurenKhorenyan

    @SurenKhorenyan

    26 күн бұрын

    Пока не знаю ситуаций, где без eval не обойтись. Сможете привести пример? Да, инструменты выполняют свои задачи. И я показываю, что есть более подходящие инструменты для этих же задач

  • @IvaNFallout

    @IvaNFallout

    26 күн бұрын

    @@SurenKhorenyan Из личного опыта. Был проект, в котором мы хранили формулы во внешнем хранилище. Было требование от бизнеса, что формулы могут меняться несколько раз в день. Можно было бы придумать механизм расчета таких показателей на стороне СУБД, но sql трудно поддается автоматизированному тестированию и для нас это стало решающим фактором в пользу eval

  • @SurenKhorenyan

    @SurenKhorenyan

    26 күн бұрын

    @@IvaNFallout ох, жуткий пример. Уверен, можно было сделать иначе, хотя бы хранимой функцией, ну или инструмент построить для этого. Я бы с удовольствием поработал над такой задачей

  • @MAKS19961204
    @MAKS1996120426 күн бұрын

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

  • @SurenKhorenyan

    @SurenKhorenyan

    26 күн бұрын

    По памяти датакласс frozen + slots занимает чуть меньше. По скорости не проверял. А что подразумевается в скорости? Время инициализации?

  • @MAKS19961204

    @MAKS19961204

    26 күн бұрын

    @@SurenKhorenyan если память не подводит то да, про инициализацию речь шла. Это хорошо ощутимо на тысячах объектов.

  • @SurenKhorenyan

    @SurenKhorenyan

    26 күн бұрын

    @@MAKS19961204 надо будет прочекать. Допускаю, что тюпл действительно быстрее, так как там меньше магии

  • @dmitry-lz1ny
    @dmitry-lz1ny26 күн бұрын

    Про operator уже давно не слышал. По моему люди чаще используют генераторы или лямбды. Про скорость я не знаю, возможно оператор даже быстрее. Ну и возможно людям не нравится ещё один импорт тянуть

  • @SurenKhorenyan

    @SurenKhorenyan

    26 күн бұрын

    Как генератор может помочь в данном случае? Лямбда работает медленнее оператора, потому что оператор это по сути то же самое, что мы пишем просто как оператор: a + b. А если делать через лямбду, то нужно ещё сначала вызвать функцию, а это занимает время

  • @progweb3036
    @progweb303626 күн бұрын

    operator.countOf написан по camelCase, ужас... A на счёт того что нету прямого оператора - заменителя этой функции, я согласен, но у простого списка по моему был метод count с идентичным функционалом

  • @SurenKhorenyan

    @SurenKhorenyan

    26 күн бұрын

    Да, наследие старого питона. Угу, такой метод есть, но для этого нужно создать весь список, а это не подходит, так как займёт память

  • @Kocherga38
    @Kocherga3826 күн бұрын

    Спасибо за видео!

  • @SurenKhorenyan

    @SurenKhorenyan

    26 күн бұрын

    Пожалуйста!

  • @user-jw9fx1xk5s
    @user-jw9fx1xk5s26 күн бұрын

    Есть случаи когда без lambda не обойтись. Например в pyqt когда требуется подключить слот с аргументом к сигналу.

  • @SurenKhorenyan

    @SurenKhorenyan

    26 күн бұрын

    Там тоже можно без лямбды, я вот делал: github.com/mahenzon/robohand-gui-control/blob/76a325c4468dbd2addaf8e75105fdf89ded40bef/app/widgets/debounced_slider.py#L35

  • @user-jw9fx1xk5s

    @user-jw9fx1xk5s

    26 күн бұрын

    @@SurenKhorenyan Это не то). У функции self.slider_changed нет аргументов, а речь о том как передать в функцию self.slider_changed аргументы не вызывая функцию? Такой вариант self.valueChanged.connect(self.slider_changed(arg)) не сработает)

  • @SurenKhorenyan

    @SurenKhorenyan

    26 күн бұрын

    @@user-jw9fx1xk5s для этого есть пара разных вариантов: либо делать обёртку типа класса с методом __call__, этот аргумент в __init__ закидывать. Либо через partial просто

  • @dmitry-lz1ny
    @dmitry-lz1ny26 күн бұрын

    Магия питона прекрасна, но её стоит использовать, когда ты уже понимаешь, как оно там работает. Иначе вы просто закапсулируетесь в питоне и если когда то понадобится что то на другом язык написать, то габела. То есть не нужно игнорировать алгоритмы. Но автор канала сам ролики по алгосам выпускает, то есть это просто пожелание новичкам.

  • @SurenKhorenyan

    @SurenKhorenyan

    26 күн бұрын

    Всё так, понимать нужно, но не обязательно сразу закапываться

  • @dmitry-lz1ny

    @dmitry-lz1ny

    26 күн бұрын

    @@SurenKhorenyan Не ну если пойдешь в бигтех устраиваться и тем более в яндекс, то там тебя только так алгоритмами задрючат. По моему не так важно на кого ты идешь. Там в любом случае спрашивают алгоритмы. А так на питоне они не сильно актуальны, а вот на более низких языках уже чуть нужнее. К примеру в гошке им найдется применение ибо там почти нет магии.

  • @SurenKhorenyan

    @SurenKhorenyan

    26 күн бұрын

    Из крупняков яндекс больше всех и дрючит по алгоритмам, у них там на это пунктик. У других попроще и более приближенные задачи (их тех, с кем я сталкивался). Алгоритмы сильно актуальны на любом языке. Пройти по списку за O(n^2) или O(n)? Существенная разница

  • @dmitry-lz1ny

    @dmitry-lz1ny

    26 күн бұрын

    @@SurenKhorenyan Да. В принципе это один из столпов программиста

  • @Qustoos
    @Qustoos26 күн бұрын

    Отличное видео!

  • @SurenKhorenyan

    @SurenKhorenyan

    26 күн бұрын

    Кайф, спасибо! Рад, что вам понравилось!

Келесі