Принцип EAFP в Python, работа с исключениями в Python. Применение принципов Zen of Python

Поделиться
HTML-код
  • Опубликовано: 21 авг 2020
  • Мой курс «Хардкорная веб-разработка» - course.to.digital
    Книжный клуб Ботаним!, где мы читаем хорошие ИТ-книги: botanim.to.digital/
    Telegram: t0digital.t.me
    Сказать спасибо за это видео можно здесь - boosty.to/digitalize.team
    EAFP - важный принцип, позволяющий писать более «pythonic» код. EAFP расшифровывается как Easier to ask for forgiveness than permission, а его антипод LBYL - Look before you leap. Поговорим о разнице и о том, почему именно EAFP выбран разработчиками Python как правильный способ проектирования приложений.
    /****************** about ******************/
    Меня зовут Алексей Голобурдин, я программирую с 2004 года и на этом канале делюсь своим опытом. Я основатель и руководитель компаний:
    - Диджитализируй digitalize.team, разрабатываем сложные IT системы для бизнеса;
    - Salesbeat salesbeat.pro, комплексный модуль доставки для интернет магазинов.
    Если у вас есть проект на разработку, пишите нам на hi@digitalize.team.
    С другими предложениями, а также если вам нужна одна или несколько индивидуальных консультаций/уроков по разработке (3000 руб/час), пишите мне на alexey@salesbeat.pro.
    Telegram канал - t.me/t0digital
    ВК - digitalize.team
    RuTube - rutube.ru/channel/24802975/ab...
    Дзен - dzen.ru/id/6235d32cb64df01e6e...

Комментарии • 196

  • @kalik54
    @kalik54 3 года назад +82

    Наверное самый полезный канал по пайтону на русскоязычном ютубе

    • @t0digital
      @t0digital  3 года назад +3

      Спасибооо!

    • @user-oi1zl6de8i
      @user-oi1zl6de8i 3 года назад +8

      Ещё Олег Молчанов неплохо объяснял (давно у него роликов не было). И автор этого канала, на котором мы сейчас, безусловно - молодец!

    • @kalik54
      @kalik54 3 года назад +3

      @@user-oi1zl6de8i Да, как раз когда писал, Олег был на уме как и диджитализируй)

    • @user-oi1zl6de8i
      @user-oi1zl6de8i 3 года назад +2

      @@kalik54 Да, эти товарищи вносят существенный вклад в развитие python-сообщества в России и русскоговорящих странах.

    • @govdamikhaylo4183
      @govdamikhaylo4183 3 года назад

      @@user-oi1zl6de8i +. скорее он бы вернулся(

  • @mrhayden992
    @mrhayden992 3 года назад +129

    Отличный контент. Хочется увидеть серию уроков по aiohttp, поддержите лайками чтобы поднять в топ.

    • @rishatsharafiev
      @rishatsharafiev 3 года назад +5

      starlette и fastapi интереснее

    • @user-zg2bx5cb3d
      @user-zg2bx5cb3d 3 года назад +11

      @@rishatsharafiev aiohttp и asyncio интереснее

    • @Uni-Coder
      @Uni-Coder 3 года назад

      @@rishatsharafiev Асинхрон - концепт современного кодинга, это прям надо. Это есть в C++, C#, Python, Rust и вообще везде (правда, Java немного страдает), это надо изучать не только питоноидам.

    • @MegaFeel1
      @MegaFeel1 3 года назад

      А мне бы Sanic, сколько людей столько мнений))

    • @cashncarry8
      @cashncarry8 3 года назад

      @@MegaFeel1 хорошо, что фреймворков меньше))

  • @pontiuspilatus8475
    @pontiuspilatus8475 3 года назад +10

    Спасибо за контент Алексей. Мне нравится, что вы уделяете внимание картинке и звуку.
    Предлагаю снять ролик о том, как дебажить на пайчарме. Было бы интересно.

  • @sulfur32066
    @sulfur32066 3 года назад +15

    Можно ли еще видео как до этого было, часовое по django, очень зашел формат, только по django REST)

  • @chilisten
    @chilisten 3 года назад +2

    Алексей, спасибо большое за вашу работу.
    Просто и понятно!

  • @swimmwatch
    @swimmwatch 3 года назад +1

    Лайк однозначно! Качество контента растёт на глазах!

  • @filipfilip4184
    @filipfilip4184 Год назад

    Приятно слушать, смотреть и учиться. И все без воды. Спасибо!

  • @Geolimber
    @Geolimber 3 года назад +3

    Шикарный выпуск. Такие ньюансы очень полезны. Даёшь больше best practice примеров из Python и Django!

  • @uszr1
    @uszr1 3 года назад

    Спасибо! Как всегда отличная подача и полезная информация!

  • @user-yf4qs9mn2i
    @user-yf4qs9mn2i 2 года назад

    классно, что говоришь быстро, не нужно ускорять видео)))

  • @mmohelp
    @mmohelp 3 года назад +1

    Спасибо ,как всегда огонь инфа!

  • @markervictor
    @markervictor 3 года назад

    Пару дней назад нашел ваш канал и уже пересмотрел больше половины видео. Рассказывает обо всем очень доступно и интересно! Из тех, что попадались на русском RUclips, наверно, первый канал, который не рассчитан на абсолютно начинающих и не рассказывает, как "Выучить Python за час" или что-то из этой серии. Удачи в развитии!

  • @nik-ix2md
    @nik-ix2md 3 года назад

    Как всегда отличное и полезное объяснение по делу! Спасибо!

  • @eugeneburdin704
    @eugeneburdin704 3 года назад

    Спасибо за выпуск. Хорошо прояснил официальные подходы !) Круто!

  • @toomanof
    @toomanof 3 года назад

    Лаконично и доступно! Пять балов за изложение мысли!

  • @MartinEden-ps6ld
    @MartinEden-ps6ld 3 года назад

    блин, это один из лучших каналов по программированию, от души за все советы))

  • @andreymishuk2188
    @andreymishuk2188 3 года назад

    суперская подача инфы, больше видео как надо и как не надо !)))

  • @arthurkeller3119
    @arthurkeller3119 3 года назад

    серьезно, такая мелочь, но очень полезная инфа, оказывается данные подходы еще и именуются как-то, сколько раз с другими программистами спорили как правильно, как нет (не только питон), теперь же все по полочкам, спасибо за действительно полезный ролик, развития каналу

  • @russianstan
    @russianstan 3 года назад

    Алексей, круто! Спасибо большое) Очень бы хотелось побольше подобных видео о лучших практиках

  • @user-kg5sg6rx6e
    @user-kg5sg6rx6e 3 года назад +2

    Хороший ролик, спасибо :)

  • @user-wh8ww5lp2l
    @user-wh8ww5lp2l 3 года назад

    Очень полезное видео! Спасибо!

  • @westerling6368
    @westerling6368 3 года назад +6

    А что насчет скорости выполнений? Читал, что try/except выполняются медленнее, чем условия, поэтому в своём коде обычно их не использую.

    • @ievgenk.8991
      @ievgenk.8991 3 года назад

      @@avazart614 и не про чистоту кода, по всей видимости

  • @ivanshvedov1823
    @ivanshvedov1823 3 года назад +11

    Спасибо за годноту, а когда будут выпуски про aiohttp?

    • @t0digital
      @t0digital  3 года назад +2

      Скоро будут!

  • @anatolys9203
    @anatolys9203 3 года назад

    Было очень полезно! Спасибо!

  • @bpospanov
    @bpospanov 3 года назад

    офигенное видео, спасибо!

  • @copycat774
    @copycat774 3 года назад

    Неоднократно задавался вопросом, использовать условия или исключения. А, оказывается, все так просто. Теперь смогу сделать свой код лучше. Благодарю.

  • @Smarandii
    @Smarandii 3 года назад +4

    Продвигаем годноту в массы

  • @balabunat
    @balabunat 3 года назад

    Очень давно так делаю, теперь просто знаю как это называется )))
    Спасибо за контент!

  • @KHANZE
    @KHANZE 3 года назад

    Спасибо мужик!
    У тебя много что узнаю. Только уважение к тебе.

  • @peronium_
    @peronium_ 3 года назад

    Круто снял!

  • @vyacheslavgvorus3883
    @vyacheslavgvorus3883 3 года назад +1

    Круто и очень полезно! Дьявол скрывается в деталях)

  • @TarTarus
    @TarTarus 3 года назад +2

    Добрый Комент!

  • @bistronousogust
    @bistronousogust 3 года назад +5

    "Да прибудет с вами сила" - это уже устраешая фраза. Надо говорить: "Таков путь!" ;)
    Спасибо за кусочек питонячей дисциплины.

  • @azamatmuratshin
    @azamatmuratshin 3 года назад

    Спасибо за контент! Нужно скинуть в чаи группы, им должно понравиться)

  • @SUPERustam
    @SUPERustam 3 года назад +7

    В первом примере LBYL подхода, должен быть еще else с выводом текста об не найденном ключе))

  • @eldorpulatov566
    @eldorpulatov566 3 года назад

    Спасибо за Python контент!

    • @t0digital
      @t0digital  3 года назад

      Рад, что полезно:)

  • @user-nq5jf2og6e
    @user-nq5jf2og6e 3 года назад

    Полезное видео. Больше подобных)

  • @makediffdev
    @makediffdev 3 года назад

    Отличный контент. Круто прогрессировал последнее время

    • @t0digital
      @t0digital  3 года назад

      Спасибо! А что бы вы отметили, что за последнее время стало лучше на ваш взгяд? Темы видео, подача, картинка, звук, ещё что-то? Полезно будет знать.
      Спасибо!

  • @z0uRChannel
    @z0uRChannel 3 года назад

    Просто и грамотно. Пасиб

  • @21138532110q
    @21138532110q 3 года назад +3

    Вообще, слышал такое мнение: если знаешь что может пойти не так - используй if-else, так как исключение в питоне довольно медленные. Сами же исключения используются для исключительных ситуаций, когда что то идет не так из за внешних факторов. То есть в примере с диктом я бы использовал if else, в случае сетевого взаимодействия или дискового - уже исключения.

    • @SourPassionParty
      @SourPassionParty Год назад +2

      Да чем всех dict.get( ) не устраивает?

  • @user-fm5sz5in5g
    @user-fm5sz5in5g 3 года назад

    Я тоже за подход, что легче просить прощения, чем разрешение. Спасибо за прекрасный материал.

  • @user-lz3ez3nn4j
    @user-lz3ez3nn4j 3 года назад

    Спасибо, лайк!

  • @arturlomakin3555
    @arturlomakin3555 3 года назад +1

    Круто!

  • @rumartru
    @rumartru 3 года назад +1

    Спасибо! Лайк! От других программистов слышал обратное, try/except использовать если по-другому нельзя, т.к. дорогая операция. Хотя тесты которые я видел показывали, что дорогой становится при частой ловле исключений.

    • @t0digital
      @t0digital  3 года назад +2

      Try/except дешёвый, если не генерится исключение, а генериться оно должно редко, это ведь исключительная ситуация

  • @psychopiece
    @psychopiece 3 года назад +1

    Отличное видео! Алексей, когда же будет запуск обучения?

    • @t0digital
      @t0digital  3 года назад +1

      Скоро-скоро!

  • @dddyom
    @dddyom 3 года назад +1

    Спасибо!

  • @MrDimka12101
    @MrDimka12101 3 года назад +4

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

  • @gatapov
    @gatapov 3 года назад

    Отлично рассказываете! У вас есть видео об ООП в python? Если нет, то было бы круто от вас услышать базовые вещи об этом! Спасибо за ваш труд!

  • @ibragim1989
    @ibragim1989 3 года назад +3

    Все в видео очень лаконично и ясно, будто хороший код на питоне. :)
    Вопрос, почему часто читаю в книгах по computer science, что использование исключений является не очень хорошей практикой программирования? И даже при создании своего языка Goland авторы, например, решили отказаться от поддержки исключений. Чем это вызвано?

    • @ievgenk.8991
      @ievgenk.8991 3 года назад

      Потому что исключения начинают использоваться не по назначению, они разворачивают стек вызовов и добавляют оверхед по производительности и потребляемой памяти только ради того, что бы программисты смогли снова вернуться во времена оператора goto. Исключения добавляют неясности в кодоввю базу и надо усердно курить мануалы что бы понять может ли какая то функция прокинуть ошибкуи и в каких ситуациях

  • @tihon4979
    @tihon4979 6 месяцев назад

    Огонь! Полностью согласен!!!

  • @victortamanov
    @victortamanov 3 года назад

    Спасибо! Как раз вот пишу код и думаю об этом. Очень кстати! Было бы супер как-нибудь поглядеть на код модульных тестов, которые в том числе проверяют такие ветки с прерываниями, чтобы велосипед не изобретать.

  • @user-fb6ti1nz7t
    @user-fb6ti1nz7t 3 года назад

    Классный формат, рассказывать про такие маленькие фичи. И понимание зена возрастает, и код лучше будет

  • @user-cr8hf7ur8o
    @user-cr8hf7ur8o 3 года назад +2

    Как интересно, а я всеми силами старался избежать try except, приму к сведению, спасибо.

    • @user-rs5zq9hy4m
      @user-rs5zq9hy4m 3 года назад

      Я так же)

    • @MA-channel1
      @MA-channel1 3 года назад

      Оно тоже затуманивает логику как и if на каждом шагу. Если except на каждом шагу то это не лучше а даже медленнее
      А если не на каждом шагу проверка нужна то можно и без if'а, и без локальных except (только большой "всё-ловящий" try/except)

  • @tahirjalilov
    @tahirjalilov 3 года назад

    Блин, почти не использовал try/except в своем коде, везде пихал if/else. А после этого видео, буду писать правильно. Спасибо!!!

  • @BagsySigel
    @BagsySigel 3 года назад

    Полезная инфа

  • @dgrigorev
    @dgrigorev 3 года назад

    Пасиб)

  • @LewaSGN
    @LewaSGN 3 года назад

    А я вместо кучи ифов пользуюсь свичкейзом через метод словаря .get(key, default=None). Получается очень красиво и читаемо!
    Хороший ролик, лайк!

    • @t0digital
      @t0digital  3 года назад +1

      Дааа, .get очень удобный метод, тоже часто использую!
      Спасибо!

  • @user-gv4dy2vd2c
    @user-gv4dy2vd2c 3 года назад

    God bless you!

  • @konkon4658
    @konkon4658 3 года назад

    Злой комментарий)))
    Спасибо за видео!

  • @dmitriyobidin6049
    @dmitriyobidin6049 3 года назад +8

    В примере не совсем понятно, какое требование стоит в ТЗ. Т.к. в зависимости от этого может быть и If лучше, если ключа у нас действительно может не быть в словаре.
    Почему-то вы изначально за аксиому взяли, что нормальное поведение - это когда ключ есть. А если это не так? То нормальным будет уже if...
    Да и к тому же пример с if не полон, если добавить туда else с выводом той же ошибки, то разница уже не так очевидна.
    И почему во втором примере нельзя написать так?
    try:
    with open(tmp_file) as f:
    print(f.read())
    except IOError as e:
    print("Error")

    • @ievgenk.8991
      @ievgenk.8991 3 года назад

      наверно что бы можно было понять где падает open а где read. Но это как то нелепо описывать условную логику через эксепшены.

  • @user-dy4nj1cd2d
    @user-dy4nj1cd2d 3 года назад

    Обожаю свои программы заворачивать снизу доверху в except Exception! Правда я обычно пишу сервероподобный софт, а такие вещи делаю, чтобы весь процесс не упал из-за пропущёной запятой в тридевятой вьюхе.

  • @user-rg4fs5ys5w
    @user-rg4fs5ys5w 3 года назад +2

    Когда будет урок про git? В первых видео обещали, но так и не разобрали данную тему :(
    Сейчас на работе пришлось самому разбираться. Очень жалею что не юзал это раньше.

    • @t0digital
      @t0digital  3 года назад +1

      Я писал в 2013м статью по базовому гиту - goloburdin.blogspot.com/2013/11/git-bitbucket-20.html
      Видео тоже планирую, просто хочется сделать что-то глубже, чем просто commit/pull/push/merge/checkout

    • @MrBytmin
      @MrBytmin 3 года назад

      Как вас вообще на работу взяли)

  • @zshfan
    @zshfan 3 года назад

    Огромное спасибо за видео, хоть пока мне и без толку данная информация (не тот уровень скила), но прям от видео веет дружеским наставничеством.
    Было бы кстати неплохо посмотреть ваш подход к началу проекта, с чего стоит начинать писать.
    P.S. А mailto:mailto: так и не исправили :-)

  • @mcolegon
    @mcolegon 2 года назад

    Ээээ...круто)

  • @pavelgrishin
    @pavelgrishin Год назад

    Есть мнение, что содержимое try выполняется 2 раза. 1й раз на пробу брода, 2й раз на переход брода. Поэтому если много проходов по траю - будет растрата ресурсов

  • @sw1881
    @sw1881 3 года назад

    Добрый коммент=)

  • @MrDimka12101
    @MrDimka12101 3 года назад

    В защиту LBYL скажу, что сейчас в python есть довольно много инструментов, с помощью которых можно делать подобные проверки красиво и прозрачно. К примеру, библиотека trafaret. Всегда её использую при обработке тела запроса клиента на сервер.

  • @user-wz5tk2se3n
    @user-wz5tk2se3n 3 года назад

    Что там по курсу??

  • @user-dy2ei6hl5q
    @user-dy2ei6hl5q 3 года назад

    Анонсируйте подалуйста примерную дату курсов

  • @sonicsp3149
    @sonicsp3149 3 года назад

    Было бы интересно от вас послушать как SOLID применяются в Python. Думаю тема достаточно непростая и очень важная!

    • @kalik54
      @kalik54 3 года назад

      github.com/heykarimoff/solid.python

  • @vladburba5734
    @vladburba5734 3 года назад

    Хороший Рол вкусный! Хорошо зашёл) Кто такие Катаны? «здорова Катаны»

    • @drdeepdreamer7090
      @drdeepdreamer7090 3 года назад +1

      Думаю, что имеется в виду кОтаны. Ну т.е. мальчики выросшие из котяток... 😃

  • @Oleksii_Leshchenko
    @Oleksii_Leshchenko 3 года назад

    А че) очень полезно)

  • @TeppopucT
    @TeppopucT 3 года назад +1

    Очень, очень не нравятся блоки try except в коде.
    Единственный момент, когда могу пойти на компромисс - это интеграции - различные запросы. Но при возможности, закидал бы камнями разрабов в момент разработки либ, методы которых бросают исключения (привет request timeout error).
    Мало того, что сами блоки занимают много места и делают код менее читабельным, так некоторые просто напишут "except: pass" и спят спокойно.
    Да и в целом... все ошибки не переловишь и этот домик из "except ...: ..." может расти и расти.
    И это одна из причин, почему перехожу потихоньку на Golang и пишу не dictionary[key], а dictionary.get(key) и обрабатываю None.
    С файлом пример понравился, но будем надеиться, что, во время работы с ним одного потока, другой не делает критических изменений с флогом "w+".

  • @rmatveev
    @rmatveev 3 года назад

    Последний фрагмент кода нужно было написать так, чтобы *try-except* был внутри функции?

    • @t0digital
      @t0digital  3 года назад

      try:
      something = some_dict["key"]
      except KeyError:
      # do some stuff
      pass
      else:
      some_func(something)
      Напр, так

  • @MrPavelFrolov
    @MrPavelFrolov 3 года назад +1

    я, в последнее время перешел assert'ы:
    from assertpy import assert_that
    some_dict = {}
    assert_that(some_dict, 'Dictionary').contains_key('key')
    AssertionError: [Dictionary] Expected to contain key , but did not.
    Да, не так оптимально, да, асерты не совсем про валидацию, но, на объёмах - работает лучше, чем куча try/except, в плане качества кода, читабельности. Где нужно оптимальнее - конечно меньше валидаций.
    Разработчки библиотеки сказал, что я пользуюсь defensive assertions, что бы это не значило :).

    • @MrPavelFrolov
      @MrPavelFrolov 3 года назад

      @Вячеслав Украинцев так и есть. Поэтому они не про вадидацию. Но тут сторонняя библиотека, ну и асерты, прямо по назначению, я что-то и не использовал никогда.

  • @onio2942
    @onio2942 3 года назад

    Не является ли в случае со словарями использование метода get более предпочтительным вариантом получения значения по ключу? Или этот метод по сути и есть отображение EAFP?

    • @t0digital
      @t0digital  3 года назад +1

      если задача просто получить значение по ключу, а если ключа такого в словаре нет, то взять некоторое дефолтное значение - то да, метод get предпочтительнее. EAFP он не только про словари, это общий принцип, просто на словарях его часто показывают. В видео есть пример с открытием файла и возможным состоянием гонки без EAFP

    • @onio2942
      @onio2942 3 года назад

      @@t0digital Спасибо за ответ! :)

  • @antontsygulev6599
    @antontsygulev6599 Год назад

    С меня предоставляется коммент за годный контент! Жаль, что задонатить не могу(

  • @cashncarry8
    @cashncarry8 3 года назад

    А точно стоит ронять весь код ради ключа/файла?
    В логи записать ERROR недостаточно будет?

    • @t0digital
      @t0digital  3 года назад +1

      Ронять весь код не надо, если это не фатальная проблема, с которой невозможно продолжать. Обработка исключений и eafp и позволяет не убивать программу.

  • @FermaKaktysov
    @FermaKaktysov 3 года назад

    не знаю что написать но напишу)

  • @pythondeveloper252
    @pythondeveloper252 2 года назад

    4:56 у вас при исключении файл не закроется.
    И кстати конструкция with закрывает файл после действий, но здесь это не поможет.

  • @spappinventor2850
    @spappinventor2850 3 года назад +1

    А почему нет блока else, он нужен чтобы сообщить что ключа нет! )

  • @maxzhenzhera
    @maxzhenzhera 3 года назад

    А если обернуть весь код блоком трай/эксепт, чисто в целях отлова неожиданных ошибок?

    • @MA-channel1
      @MA-channel1 3 года назад

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

  • @Dake6i
    @Dake6i 3 года назад +2

    Я не спрошу "что такое принцип EAFP", я спрошу "кто такие котаны или катаны"

    • @cashncarry8
      @cashncarry8 3 года назад

      Те кто отключают интернет во время деплоя))

  • @doomymax577
    @doomymax577 3 года назад

    я так и не понял объясните еще раз- нужно всегда проверять есть ли ключ в структуре данных и потом его применять?

    • @t0digital
      @t0digital  3 года назад

      Всегда не надо, надо, когда есть вероятность, что ключа нет в словаре. Когда что-то может пойти не так в программе, на это надо заложиться

    • @doomymax577
      @doomymax577 3 года назад

      @@t0digital вот на фронтэнде так всегда приходится делать потому сервера часто падают и поэтому в большинстве случаев так приходится делать

  • @Markisi0
    @Markisi0 3 года назад

    А в плане ресурсов что дешевле if или try/except? Что-то мне подсказывает, что первая конструкция...

    • @t0digital
      @t0digital  3 года назад +3

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

    • @Markisi0
      @Markisi0 3 года назад

      @@t0digital Спасибо за ответ!

  • @mafia2mpru
    @mafia2mpru 3 года назад

    Да, но только конструкция try except потребляет больше ресурсов чем if, python для блока try копируются все переменные и уже с копиями выполняются операции из блока try чтобы не запороть основной цикл программы и не испортить переменные если код в try свалиться в исключение и продеться откатывать

  • @meh2414
    @meh2414 3 года назад +2

    добрый комментарий
    добрый комментарий
    добрый комментарий

    • @t0digital
      @t0digital  3 года назад

      Хахаах, спасибооо!

  • @redologs
    @redologs 3 года назад

    А я думал, что try/except как раз для того, чтобы минимизировать ветвления и обработчики исключений, оставив один обработчик по умолчанию на самом верхнем уровне.

  • @kostyaten
    @kostyaten 3 года назад

    try/except вызывает отдельный стек Python в блоке try , по этому он будет медленнее. По этому с точки зрения языка вызов if 'key' in dict будет быстрее. if 'key' in dict и dict["key"] не вызывает два раза поиск ключа, а один раз, так как в стеке индекса он будет первый и пайтон всего лишь сравнит тот ли ключ.

    • @t0digital
      @t0digital  3 года назад

      Исключения не медленнее if/else. Исключение медленнее только если оно происходит, но оно должно происходить редко, что следует даже из названия, исключение создано для исключительных ситуаций. docs.python.org/3/faq/design.html#how-fast-are-exceptions

    • @kostyaten
      @kostyaten 3 года назад

      @@t0digital Да глянул исходники для try если ключ проверяют вызывают _PyObject_GetDictPtr , для OS ещё не придумали как сделать try быстрее.

    • @kostyaten
      @kostyaten 3 года назад

      ​@@t0digital Ещё работает для Tuple

  • @user-zt4nx8ii2i
    @user-zt4nx8ii2i 3 года назад

    Вроде сишники (особенно эмбеддщики) говорят, что исключения какие-то дорогие и слишком медленные из-за того, что там какие-то манипуляции со стэком происходят. Это правда?

  • @user-rd4be1wk2j
    @user-rd4be1wk2j 3 года назад

    4:44 а разве не лучше считывать тоже в блоке try? Вдруг во время чтения что-то произойдёт.
    А, точно после открытия файла для чтения файл полностью принадлежит процессу и ошибки быть не может... поэтому покрасивше будет выделить чтение в блок else

  • @user-on5qx7cy4w
    @user-on5qx7cy4w 3 года назад

    Злой писать не охота, а вот добрый, пожалуй, оставлю. У меня такая проблема. Год назад начал изучать Питона вообще с нуля. С такого уровня, что вообще первый раз открыл cmd. Сейчас пишу программы для своего бизнеса, но у меня нет развития, потому что имеющиеся знания покрывают потребности моего дела. Я понимаю, что с таким уровнем ни в какую компанию не попадёшь, а хотелось бы связать себя с профессией программиста. Прямо беда. Хочу развиваться, но вместо этого бег на месте.

  • @user-gn8jo3zd8y
    @user-gn8jo3zd8y 3 года назад

    1. try except сложнее чем использование if key in, в читабельности для человека, из за количества возможных отрицательных срабатываний, которые спрятаны в исключениях. И if является более явным и однозначно трактуемым, нежели exception.
    2. Исключения крайне ресурсоемки, и программирование на них, если можно обойтись без них, это табу. В процессе, появления исключения, в питоне собирается информация о нем, что требует много ресурсов, и останавливает поток исполнения. Такие места можно заддосить.
    3. Ошибки лучше оформлять
    if key not in data:
    raise Exception('исчерпывающее описание данной ситуации')
    нежели то что вы привели в пример. Ваш пример можно часами трактовать, а какую ситуация для чего разраб покрыл этим exception.

    • @t0digital
      @t0digital  3 года назад

      Исключение такие же дешёвые, как if, если не возникает исключения, а возникать они должны редко исходя даже из названия. Что if более читаем, чем except - нет же. В исключении явно понятно, какая логика нормальна, какая исключительна, в if else обе ветки равнозначны и без контекста, без коментов это непонятно. Райзить Exception вместо KeyError или IndexError - не надо.

    • @user-gn8jo3zd8y
      @user-gn8jo3zd8y 3 года назад

      @@t0digital
      1. Style
      docs.python.org/3.8/faq/design.html#how-fast-are-exceptions
      2. Performance
      paltman.com/try-except-performance-in-python-a-simple-test/
      3.
      - Как в коде, который покрыт несколькими слоями try except finally, излишние try, усложняет структуру кода, доп отступами от которых не избавиться.
      - Две строки, лучше чем четыре.
      - Как быть здесь? На каком ключе споткнулись?
      try:
      value = data['key1']['key2']
      except IndexError:
      pass
      - может все же вот так понятней?
      if 'key1' not in data:
      raise Exception('исчерпывающий ответ что пошло не так')
      исполнение продолжилось.
      - к какому жесткачу, приводит неосторожное использование.
      try:
      value = function()
      except Exception:
      pass
      - трактовки.
      Что можно ожидать от if key in data ?
      Наверно, проверку вхождения, в массив, в строку или есть ли ключ в hashmap, зависит от типа данных data.
      Что можно ожидать от try except. Очень много всего, особенно когда обернута функция, и глубину вызовов внутри этой функции не видно, и на любом этапе может произойти исключение, которое этот перехват скроет. А бывает и приведет к некорректному исполненbю алгоритма.
      - нарушение логики.
      С исключениями, мы предпочитаем сначала наступить в кучу навоза, а потом принимать решение. А проще, посмотреть прежде чем наступать нет ли там кучу с помощью if.
      Что на итог:
      Эту конструкцию, опытный разработчик назовет вкусовщиной. Я же против этих конструкций, т.к. мы не все опытные и знаем все подводные камни и отдаем себе отчет в них, и суем их всюду.
      И это приводит к страшным поломкам. Чего не случится, если бы использовали if.

  • @RomaxSinergy
    @RomaxSinergy 3 года назад

    Денис Борисов от software enginering

  • @user-nf9mh2so1z
    @user-nf9mh2so1z 3 года назад

    Зачем вы сделали бейсбольный мячик своим крестражем?

  • @kenybond6564
    @kenybond6564 3 года назад +1

    В 1с использование такой конструкции считается плохим тоном.
    Значит программист плохо учел возможные варианты, раз у него что-то может вызвать исключение.

    • @user-dv9fk1hd3s
      @user-dv9fk1hd3s 3 года назад

      1C сам по себе считается плохим тоном.
      P.S. Ладно, шутка

    • @kenybond6564
      @kenybond6564 3 года назад

      @@user-dv9fk1hd3s давай напишем систему лучше) Аналогов я не нашел, ниша свободна.
      Не шутка)

  • @govdamikhaylo4183
    @govdamikhaylo4183 3 года назад +1

    Аригато козаимасу:)

  • @ashur1k
    @ashur1k Год назад

    Как можно сравнивать разный функционал? Если вместо каждого if использовать try except то не только сложно будет читать, но и выполняться такая программа будет намного дольше.

    • @t0digital
      @t0digital  Год назад

      Так и не предлагается везде заменить if на try/except

  • @dont-need-one
    @dont-need-one 3 года назад

    А как же быстродействие?

    • @t0digital
      @t0digital  3 года назад

      try/except быстр, когда не генерится исключение, а генериться оно должно редко