anetto1502

anetto1502

Канал про разработку на python и не только https://t.me/+0JMEYBjpMDJiYTMy
На Пикабу
Дата рождения: 29 августа
14К рейтинг 107 подписчиков 148 подписок 65 постов 25 в горячем
Награды:
За участие в Авторской неделе5 лет на Пикабу
22

Мой взгляд на новые фичи python3.10-3.12

Стабильные минорные версии Python выходят ежегодно, последние 5 лет – в октябре. Мажорные версии, будем надеяться, выходить больше не будут, хватило ада переезда с python2 на python3. В этом октябре нас ожидает python3.13 (мажоная версия 3, минорная 13). Подумалось мне порефлексировать – какие новые фичи питона вошли в мой повседневный код. Пойдём со свежего и будем погружаться в пучины истории, в этой статье дойдём до 3.10. Запускаться будем в докере на python:3.12.5-slim. Код всех примеров лежит тут.

Пример 1: python3.12 – f-строки

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

Пример 1. f-строки на стероидах

Пример 1. f-строки на стероидах

В выводе будет значение ключа:

# при запуске в python3.12

Settings: green

Для старых версий покажу, какая возникает ошибка. Полезно для "насмотренности", когда вы визуально будете отличать, это баг в коде или кто-то использует старый интерпретатор. Раньше так было нельзя, python3.11 и ранее выдаёт ошибку

# при запуске в python3.11 и ранее

print(f"Settings: {settings["color"]}")

^^^^^

SyntaxError: f-string: unmatched '['

Можно вставлять многострочные f-строки и внутри указывать любые валидные python-выражения. Красивое. Это как в 3.8 добавили мега-удобную мелочь: с помощью знака равно после переменной в f-строке мы получаем вывод в формате "название_переменной=значение". Типа

user='Gvido'

>>> print(f"{user=}")

# вывод

user='Gvido'

Пример 2: python3.11 – дополнение к исключениям

У исключений теперь есть метод add_note, с помощью которого можно дополнять порождённое исключение дополнительной информацией. Раньше нужно было либо отдельно логгировать нужное, либо колдовать над классом исключений. Укажем время возникновения исключения:

Пример 2. Дополняем исключения информацией

Пример 2. Дополняем исключения информацией

В 3.11 дополнение (note) будет выведена после самого исключения. Выглядит так:

# при запуске в python3.11

File "/app/examples.py", line 17, in main

1/0

~^~

ZeroDivisionError: division by zero

Except at 2024-08-25 11:14:18.920230

До 3.11 метода add_note не существовало:

# при запуске в python3.10 и ранее

err.add_note(f"Except at {datetime.datetime.now()}")

AttributeError: 'ZeroDivisionError' object has no attribute 'add_note'

В 3.11 также ввели Exception Groups PEP654, но мне синтаксис не очень зашёл. Вы используете?

Пример 3: python3.10 – объединение контекстных менеджеров

Починили объединение контекстных менеджеров (parenthesized context managers). Как я понял, в теории так можно было изначально, на практике это был баг. Под одним with теперь можно собирать множество сущностей:

Пример 3. Объединение внутри with

Пример 3. Объединение внутри with

В 3.10 работает

# при запуске в python3.10

<_io.TextIOWrapper name='/tmp/1' mode='w+' encoding='UTF-8'> <_io.TextIOWrapper name='/tmp/2' mode='w+' encoding='UTF-8'>

А в 3.9 и раньше жалуется на рандомную часть выражения

# при запуске в python3.9 и ранее

with (open("/tmp/1", "w+") as file1,

^

SyntaxError: invalid syntax

Пример 4: python3.10 – pattern matching

Основным нововведением 3.10 считается введение Structural Pattern Matching. В питоне изначально не было switch/case, и вопрос решался либо цепочками elif, либо с помощью словаря. Пример такого словаря можете посмотреть в полном коде к этой статье внизу. Попытка внедрить switch/case была ещё в 2006 году, но тогда решили не вводить. В 2020 году Гвидо ван Россум презентовал новую реализацию, и ещё какую. В case запихнули сразу регулярки. Встречайте: PEP636. Ну, технически 634 вводит этот функционал, а в 636 предлагается туториал. Что теперь можно сделать? Представим, что мы парсим команду, состоящую из действия и объекта, вроде "нажать кнопка"

При запуске в 3.10 после ввода двух слов получаем верный ответ

# при запуске в python3.10

Example 4. Python3.10, PEP636 https://peps.python.org/pep-0636/

Write action and object (example 'push button'): push button

You did 'push' on 'button'

На более старых версиях match не известно

# при запуске в python3.9 и ранее

match command.split():

^

SyntaxError: invalid syntax

В case можно фиксировать какие-то блоки, использовать логическое "или" и переменные

# обработчик для направления или варианта go направление

case ["north"] | ["go", "north"]:

# обработчик для разных вариантов получения объекта get, pick up, pick ... up, при этом сам объект попадёт в переменную obj

case ["get", obj] | ["pick", "up", obj] | ["pick", obj, "up"]:

И в этом match/case ещё много разных вариантов и нюансов. Это и хорошо (потому что мощь), и плохо (потому что разбирать чужой код может быть больно). Про детали у нас в канале был отличный пост.

Какие фичи показались важными вам? Я намеренно опустил всё про типы, это заслуживает отдельной статьи.

Весь проект "на потыкать" лежит тут.

В телеграм-канале DevFM пишу о полезном для разработчика: инструментах вроде parabol или fcron, интересных хаках вроде запуска LLM прямо в шрифте, оптимизаторе join в PostgreSQL. А ещё у нас есть бесплатный курс cli-for-dev по Linux на степике, немного подкастов и видео.

Показать полностью 4
4

Telegram stars

Два дня назад, 14.08.2024 Дуров включил несколько интересных механик для авторов каналов. Речь про звёздочки – Star reaction. Их можно использовать для платной подписки, показа медиа после доната или для платных реакций в качестве "спасибо" автору. Последняя фича в канале выглядит так:

Пример в канале <a href="https://pikabu.ru/story/telegram_stars_11712414?u=https%3A%2F%2Ft.me%2Fdevfm&t=DevFM&h=f6689ccdf945def1c395d4d6d00dd1927327d23f" title="https://t.me/devfm" target="_blank" rel="nofollow noopener">DevFM</a>. Если звёзд не видно, нужно обновиться

Пример в канале DevFM. Если звёзд не видно, нужно обновиться

Эти реакции анимированные (две минуты забавно, дальше могут подбешивать) и всегда стоят первыми, независимо от количества. В админке канала у владельца появляется доп вкладка со звёздами:

В статистике есть статистика (ура, рекурсия), старые бусты и новые звёзды

В статистике есть статистика (ура, рекурсия), старые бусты и новые звёзды

Как видно на скрине выше, вывод звёзд доступен через 21 день с примерной стоимостью в цент, либо на них можно купить рекламу сразу. Донат звёздочек выглядит вот так:

Отменить звёзды можно в течение 5 секунд. Если вы донатить первый, интерфейс другой:

Указываете количество, галочку анонимности и вперёд

Указываете количество, галочку анонимности и вперёд

Вот с галочкой анонимности неочевидно. Оказывается, если зажать реакцию звезды, вы попадёте в доп меню:

Лидерборд донатеров, где вы можете управлять анонимностью

Лидерборд донатеров, где вы можете управлять анонимностью

Если звёзд у вас нет, то при нажатии на звезду вам предложат их купить

Для андроида цена ниже iOS (см. второе фото), 189 за 100 звёзд против 225 для iOS. Видимо, налог App Store, хотя процент у меня не бьётся

Что же, ТГ предложил интересный заход на монетизацию контента. Чувствую вайб древних голосов ВКонтакте. В рубрике 18+ донат за отдельные фото точно найдет своё место. У остальных – увидим.

В телеграм-канале DevFM пишу о полезном для разработчика: инструментах вроде parabol или fcron, интересных хаках вроде запуска LLM прямо в шрифте, оптимизаторе join в PostgreSQL. А ещё у нас есть бесплатный курс cli-for-dev по Linux на степике, немного подкастов и видео.

Показать полностью 6 1
534

Ответ Аноним в «Пучков про переход на Rutube »12

Хотите ещё пример бездарности рутуба? У меня есть такое относительно неплохо залетевшее видео на ютубе, называется идеальный скрипт на bash https://youtu.be/FuOgKi8XPkw?si=9FsRBw_TX75NhQ-J

Там 10к просмотров, 500 лайков, довольно неплохо. Так вот, кто-то взял это видео и перезалил на рутуб. Там за 10 месяцев ровно 2 просмотра. Подозреваю, что это я и тот, кто видео перезалил. А ещё прикол, чтобы пожаловаться на авторские права, надо вот такую портянку про себя заполнить

И факс, блеать

И факс, блеать

Показать полностью 1
62

Идеальный скрипт на bash 2 | Bash ideal script 2

Сегодня продолжим изучать наш идеальный скрипт из предыдущего видео (видео прошлой части). Разберёмся с непонятными конструкциями в bash [] и [[]] и обсудим, когда можно не ставить кавычки вокруг переменных. Ниже видео с разбором, а кому удобнее текстовый вариант — добро пожаловать ниже.

Давайте разбираться. Двойные квадратные скобки в современном bash - это ключевое слово, такое же, как for. Проверить это можно с помощью команды type. Одинарные квадратные скобки - это встроенная команда, такая же, как test. Что из этого следует? Да фиг знает, по факту. Просто интересно. А вот внутри одинарных и двойных квадратных скобок можно использовать разные конструкции.

Для сравнения [[ и [ нашёл для вас очень наглядную таблицу

Источник: <!--noindex--><a href="https://pikabu.ru/story/idealnyiy_skript_na_bash_2__bash_ideal_script_2_11674891?u=https%3A%2F%2Fmywiki.wooledge.org%2FBashFAQ%2F031&t=https%3A%2F%2Fmywiki.wooledge.org%2FBashFAQ%2F031&h=7d8e895e02f84a56d75471e8cd350d73e7f6c535" title="https://mywiki.wooledge.org/BashFAQ/031" target="_blank" rel="nofollow noopener">https://mywiki.wooledge.org/BashFAQ/031</a><!--/noindex-->

Источник: https://mywiki.wooledge.org/BashFAQ/031

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

Но про переносимость куда мы говорим? Действительно, двойные квадратные скобки появились не сразу. В разделе 7.1 книги Advanced Bash-Scripting Guide (версия на русском) написано, что конструкция появилась в bash версии 2.02. Кстати, это очень большая и вкусная книжка по bash, рекомендую её, если вы зачем-то решили стать в баше экспертом. Там под тысячу страниц, материал не для слабых духом. Есть и на русском, и на английском.

Так когда появились двойные скобки? Проверим changelog баша, там можно найти первое упоминание конструкции [[]] в версии 2.02. А потом можно найти релиз, и это 1998 год. 1998, Карл. Надеюсь, все обновились с тех пор.

В man bash можно найти описание [[]], лучше посмотрите в видео этот фрагмент.

Соберём на коленке пример демонстрации важности двойных кавычек.

a="hello world"

if [[ $a == "hello world" ]]

then

echo "success"

fi

# в видео показан однострочник ниже

if [[ $a == "hello world" ]]; then echo "success"; fi

И всё хорошо, внутри [[]] действительно можно не применять кавычки, bash всё сделает корректно. Но потом модифицируем пример

# так неправильно!

if [[ $a == "hello world" ]]; then echo "success"; touch $a; fi

И вот этот код уже ломается. Вместо создания одного файла "hello world" создаются два отдельных файла. Потому что в touch надо кавычками защищать переменную

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

if [[ $a == "hello world" ]]; then echo "success"; touch "$a"; fi

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

# так безопаснее всего

if [[ "$a" == "hello world" ]]; then echo "success"; touch "$a"; fi

Давайте попробуем сконструировать выражение для оценки времени выполнения. Как корретно измерять время выполнения я планирую снять отдельное видео. Пока не будем вдаваться в детали и попробуем собрать нужную конструкцию

Утилита time выдаёт временные характеристики работы программы. Сейчас нас интересует блок real, где указано общее время работы программы согласно системному таймеру, то есть время от запуска команды до её завершения

time echo $( i=0; while [[ $i -lt 1000000 ]]; do i=$(( $i+1 )) ; done; echo $i )

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

Вернёмся к замене -lt на треугольный знак меньше. Попробуем

# ОШИБОЧНОЕ 2 итерации вместо 1кк

time echo $( i=0; while [[ $i < 1000000 ]]; do i=$(( $i+1 )) ; done; echo $i )

Вау! Отработало мгновенно. Но неправильно. Обратите внимание на вывод - прошло только 2 итерации. Потому что два больше миллиона, если смотреть на них как на строки. Строковое сравнение идёт посимвольно, и два больше 1 - истина, дальше смотреть не требуется.

По факту, нужно использовать арифметическое выполнение

time echo $( i=0; while (( $i < 1000000 )); do i=$(( $i+1 )) ; done; echo $i )

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

Подытожим: всегда используйте двойные квадратные скобки в if и while, всегда защищайте ваши переменные двойными кавычками, даже если в отдельных конструкциях баш делает это за вас. Пишите поддерживаемый код, и да пребудет с вами баш.

Заходите в наш канал DevFm в телеграмм, где выходят годные материалы для middle плюс python разработчика. Если хотите разобраться с азами Linux, то добро пожаловать в наш бесплатный курс cli-for-dev на степике. Буду рад, если вы поддержите нас позитивными оценками и обратной связью по курсу.

Показать полностью 1
19

Ответ на пост «Пузырь ВойтиВАйти»7

Все мы видим как последние несколько лет надули пузырь ВойтиВАйти. ... Мол в РФ катастрофическая нехватка ИТ-кадров.

Так и есть. Посмотрим на обзор от hh (август 2023) с вот такими цифрами по уровню конкуренции (число резюме делить на число вакансий) по областям.

Уровень конкуренции по областям. Считается как число резюме делить на число вакансий

Уровень конкуренции по областям. Считается как число резюме делить на число вакансий

Что мы видим? По РФ в целом на 1 вакансию разработчика есть всего 5 резюме. Много это или мало? Сам hh пишет так

2.0–3.9 — дефицит соискателей

4.0–7.9 — умеренный уровень конкуренции за рабочие места, здоровое соотношение между работодателями и соискателями

В Москве 3.6, то есть разработчиков дефицит. По РФ, казалось бы, это умеренный уровень конкуренции 5.1. Но, как в известном анекдоте, есть нюанс. Разработчики отличаются по уровню. Если для условного грузчика характерна высокая взаимозаменяемость, то в сфере интеллектуального труда это не так. Поэтому из 5 резюме в лучшем случае будет 0.5 сениора, 1.5 миддла и 3 джуна в лучшем случае. И, если тебе нужен миддл, то уровень конкуренции уже не 5 резюме на место, а лишь 1.5. И это сильно перекашивает рынок в сторону "рынка соискателя", отсюда зарплаты и прочие плюшки.

Конкретно сейчас, как правильно заметил автор, рынок перегрет. И начинаются детали. Люди массово идут в ИТ за зарплатами, на рынок выплёскиваются тысячи джунов. И эти джуны никому не нужны. Вот такой разрез можно увидеть по языкам:

Конкуренция по языкам программирования. И не спрашивайте, как при таких цифрах средняя конкуренция среди разработчиков 5.1...

Конкуренция по языкам программирования. И не спрашивайте, как при таких цифрах средняя конкуренция среди разработчиков 5.1...

В результате прохождения различных курсов джуны массово идут на рынок и ищут работу. Это создаёт нехилый DDOS на вакансии, когда приходят десятки и сотни откликов от специалистов без опыта, с типовым резюме и портфолио. Я иногда смотрю в чатики, где люди кооперируются для создания команды. Там прямо видны волны выпускников школ, когда люди пытаются вписаться в любой проект бесплатно и отчасти бесцельно, в плане пишут всем подряд, не вникая в суть проекта. Особенно часто такое вижу среди тестировщиков.

А в чём проблема джунов в ИТ? Они не являются производящей единицей. Более того, они отвлекают более опытных ребят, замедляя скорость работы команды. Нельзя собрать 50 джунов и с их помощью сделать продукт, на выходе получится поделка вроде Windows Vista :) В результате команда из ~10 миддлов может взять себе 1-2 джунов и всё. А джунов на рынке куда больше.

Но, собственно, потребность в ИТ разного уровня вряд ли куда-то денется. Автоматизация способна заменять людей, что приводит к существенной экономии. В комментарии @stupidchemist отметил чудесную связку "химик-технолог со знанием питона". Вот такие связки весьма и весьма перспективны. Чем больше человек погружён в предметную область, тем лучше он понимает потребности бизнеса и эффективнее может решать задачи.

Важно не забывать, что ИТ весьма широк. Тут нужны и управленцы (тимлиды), и разработчики разные (бэк, фронт, мобилки), и инфраструктура (БД, девопс, сетевики или спецы по облакам), дизайнеры, аналитики разного рода. Не только разработчики нужны, а целый пласт различных профессий.

Автор отметил "постоянную гонка знаний". Такое наблюдается во многих областях. У врачей выходят новые исследования, у электриков — новые инструменты и практики. Вопрос в скорости внедрения этих изменений, которая непосредственно в разработке велика. Инструменты и технологии слишком быстро внедряются, но не от хорошей жизни. Каждое внедрение изменений ускоряет получение результатов, ради этого весь сыр-бор. Речь, конечно, не про месяцы, но в масштабе лет всё весьма и весьма динамично. В своём посте я развивал эту идею глубже, — с такой скоростью изменений сами разработчики ещё как-то могут справиться, а вот индустрия подготовки студентов уже нет. Вероятно, по этой причине проблема нехватки кадров не решается и сомнительно, что будет быстро решена. Не умеют ещё готовить разработчиков на потоке, чтобы они раз — и могли работать. А из-за этого на рынок выплёскиваются неготовые джуны и всё по новой...

И ответный пост от @thyratr0n хорош, прочитайте его. Just do it.

Как можно починить ситуацию? Я не знаю. Со своей стороны, я пытаюсь распространять знания. Вот почти доделал на степике бесплатный курс Командная строка для разработчиков – cli-for-dev. В нём дано очень концентрированное вхождение в Linux для разработчика через практику. Добро пожаловать!

Показать полностью 2
Отличная работа, все прочитано!