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

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

КОМЕНТАРІ • 41

  • @BritScientist
    @BritScientist 17 днів тому +3

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

    • @SurenKhorenyan
      @SurenKhorenyan  17 днів тому +1

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

    • @BritScientist
      @BritScientist 17 днів тому

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

    • @SurenKhorenyan
      @SurenKhorenyan  17 днів тому +1

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

  • @catstyle1101
    @catstyle1101 16 днів тому +1

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

    • @SurenKhorenyan
      @SurenKhorenyan  16 днів тому

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

  • @IvaNFallout
    @IvaNFallout 17 днів тому +2

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

    • @user-zx6fq1ig4h
      @user-zx6fq1ig4h 17 днів тому

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

    • @IvaNFallout
      @IvaNFallout 17 днів тому

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

    • @SurenKhorenyan
      @SurenKhorenyan  16 днів тому

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

    • @IvaNFallout
      @IvaNFallout 16 днів тому +2

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

    • @SurenKhorenyan
      @SurenKhorenyan  16 днів тому

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

  • @saitaro
    @saitaro 16 днів тому +1

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

    • @SurenKhorenyan
      @SurenKhorenyan  16 днів тому

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

    • @saitaro
      @saitaro 16 днів тому +1

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

    • @SurenKhorenyan
      @SurenKhorenyan  16 днів тому +1

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

  • @MrEligos
    @MrEligos 17 днів тому +1

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

    • @SurenKhorenyan
      @SurenKhorenyan  17 днів тому

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

  • @MAKS19961204
    @MAKS19961204 17 днів тому +1

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

    • @SurenKhorenyan
      @SurenKhorenyan  17 днів тому

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

    • @MAKS19961204
      @MAKS19961204 17 днів тому

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

    • @SurenKhorenyan
      @SurenKhorenyan  17 днів тому +1

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

  • @dmitry-lz1ny
    @dmitry-lz1ny 17 днів тому +1

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

    • @SurenKhorenyan
      @SurenKhorenyan  17 днів тому

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

  • @progweb3036
    @progweb3036 17 днів тому +1

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

    • @SurenKhorenyan
      @SurenKhorenyan  17 днів тому

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

  • @user-jw9fx1xk5s
    @user-jw9fx1xk5s 16 днів тому

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

    • @SurenKhorenyan
      @SurenKhorenyan  16 днів тому

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

    • @user-jw9fx1xk5s
      @user-jw9fx1xk5s 16 днів тому +1

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

    • @SurenKhorenyan
      @SurenKhorenyan  16 днів тому

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

  • @KochergaKK
    @KochergaKK 17 днів тому

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

  • @dmitry-lz1ny
    @dmitry-lz1ny 17 днів тому +1

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

    • @SurenKhorenyan
      @SurenKhorenyan  17 днів тому

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

    • @dmitry-lz1ny
      @dmitry-lz1ny 17 днів тому

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

    • @SurenKhorenyan
      @SurenKhorenyan  17 днів тому

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

    • @dmitry-lz1ny
      @dmitry-lz1ny 17 днів тому

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

  • @Qustoos
    @Qustoos 16 днів тому

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

    • @SurenKhorenyan
      @SurenKhorenyan  16 днів тому +1

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