anetto1502

anetto1502

Канал про разработку на python и не только https://t.me/+0JMEYBjpMDJiYTMy
На Пикабу
Дата рождения: 29 августа
в топе авторов на 701 месте
12К рейтинг 103 подписчика 133 подписки 51 пост 24 в горячем
Награды:
За участие в Авторской неделе5 лет на Пикабу

Рефакторим простое на python

Давайте посмотрим на 10 строк кода.

Рефакторим простое на python Программирование, Разработка, Python, Обучение, Telegram, IT, Код, Длиннопост

Вроде всё хорошо. Классическое открытие файла с помощью контекстного менеджера with, классическая построчная обработка. Разбиваем строку, записываем в список словарей. Всё ли по канону? Неа:

1. Смотрим документацию: readlines возвращает список всех строк файла. Значит, для большого файла может быть беда. Современный питон позволяет итерироваться сразу по объекту file_. Просто пишем

for line in file_:

2. raw_line[0] и прочие индексы — это всегда ужас. Заменяем на

fio, login = line.split(";")

Вроде то же самое, но мы сразу понимаем, что было в строке. И тут же видим следующую проблему.

3. А что, если в строке нет двоеточия, или этих двоеточий больше одного? То есть нужна обработка ошибок на исключение ValueError, если справа split вернул не два значения. Добавляем try-except.

4. Частая проблема split — это лишние пробелы. Скорее всего, потребуется strip всем переменным после split.

Итого 4 ошибки на 10 строк кода.


Теперь посмотрим на переработанный код. Docstring вырезан для краткости.

Рефакторим простое на python Программирование, Разработка, Python, Обучение, Telegram, IT, Код, Длиннопост

Код теперь крут:

1. Есть аннотация типов. Понятно, что на входе строка, на выходе список.

2. С файлом всё работаем через контекстный менеджер, то есть закрыть не забудем — оно само

3. Не забыли про запрет использования file как ключевого слова, поэтому file_

4. При разбиении строки по точке с запятой используем именованные переменные

5. При ошибках — кастомные исключения. Не забудьте их документировать в docstring

6. Добавлены strip для убирания лишних пробелов по краям. Опционально

7. Выходная переменная называется logins

8. При добавлении элемента в список мы на последнем элементе добавили запятую, чтобы при расширении словаря не ловить ошибку.

В общем, каждая строка на своём месте. Или всё ещё нет?


Возьмём такой входной файл

Иванов Иван;anetto
Сидоров Петр;bnetto
Петров Артём;сnetto

Для него вывод итогового logins будет выглядеть так

[{'fio': 'Иванов Иван', 'login': 'anetto'}, {'fio': 'Сидоров Петр', 'login': 'bnetto'}, {'fio': 'Петров Артём', 'login': 'сnetto'}]

Этот словарь не является удобной конструкцией, ФИО доступно как logins["fio"]. Кроме того, мы демонстрируем наружу внутреннее представление, нарушая принцип инкапсуляции. Замена словаря на список, например, заставит переписать весь код, который использует эту структуру данных. Какой может быть выход?


Создадим класс Student и превратим словарь в экземпляр класса. Можно использовать namedtuple из collections, но мы пойдём своим путём - создадим класс с двумя полями (fio, login) и двумя методами (конструктор и repr для вывода). Теперь logins будет списком экземпляров класса.

Рефакторим простое на python Программирование, Разработка, Python, Обучение, Telegram, IT, Код, Длиннопост

Бонусов много:

1. Мы скрываем внутреннее устройство Student. Наружу мы отдаём только пару полей, откуда мы их берём никто снаружи не знает. Вместо logins["fio"] теперь используется logins.fio.

2. Можем к Student добавлять методы. Например, вывод фамилии с инициалами в стиле Иванов И.И. — теперь это в нашей власти. В примере в repr выводится ФИО:логин. Мы полностью можем кастомизировать вывод.

3. Можем добавить новые способы создания этого студента, например, данные брать из базы данных.

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


Теперь вывод выглядит так

[Иванов Иван:anetto, Сидоров Петр:bnetto, Петров Артём:сnetto]

В телеграм-канале разбираем разные нюансы из жизни разработчика на Python и не только — python, bash, linux, тесты, командную разработку. На ютуб-канале вы можете посмотреть часовой стрим по созданию небольшого проекта на gitlab.

PS: а как лучше вставлять фрагменты кода? В цитатах нет подсветки :(

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

Как расширить технический кругозор

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


Как организовать процесс постоянного поиска информации? Нужно на постоянной основе (в идеале ежедневно, нормально раз в несколько дней, приемлемо еженедельно) потреблять разнородную информацию как в своей профессиональной области, так и в различных соседних. Это существенно расширяет кругозор и повышает вероятность решения новой задачи впоследствии. Не стоит забывать и про не-технические скиллы, куда входят управление людьми, воспитание детей, истории из жизни — это позволит ориентироваться не только в технологиях, но и в жизни. Как источник последнего я люблю пикабу :)


Неплохим источником информации для постоянного потребления могут быть проверенные телеграм-каналы, подкасты (radio-T не дремлет), хабр, hackernews и другие площадки.


На хабре следует каждый день читать топ-3 статьи за сегодня, еженедельно читать лучшие 20 статей за неделю. При этом важно смотреть не только саму статью. Часто более полезным является чтение комментариев, где сторонние люди любыми способами постараются доказать, что автор не прав. И чужие мнения помогут развить твоё критическое мышление — умение видеть проблему в предлагаемом способе решения задачи.


В году чуть больше 50 недель. За год реально прочитать 500 статей при еженедельном чтении десятка. Эти 500 статей и комментарием с обсуждением пополнят копилку решений и обсуждений. Обсуждая с коллегами очередную задачу, можно приобрести опыт обсуждения 500 других задач. И подойти к следующей задаче во всеоружии.


Помни: пока ты спишь, враг качается.


В телеграм-канале разбираем разные нюансы из жизни разработчика на Python и не только — python, bash, linux, тесты, командную разработку. В прошлом посте тут мы на часовом видео-стриме разбирали порядок создания небольшого python-проекта.


*Я могу говорить за python backend developer, современный data science и devops. Но думаю, что в других областях ситуация схожая


А какие крутые источники профессиональных знаний у вас?

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

Учебный python-проект student на gitlab с тестами, часть 1

Периодически приходится объяснять одни и те же детали работы с python в gitlab. Решил записать видео-версию, чтобы покрыть часто возникающие вопросы.


Часовое видео включает в себя полноценную работу в консоли и редакторе vim.  Раскрыты следующие аспекты:

1. создание проекта в gitlab

2. консольную работу в git (git status / add / commit / diff / push), в том числе удобные alias для ускорения работы

3. pylint, в том числе выключение некоторых диагностик в тестах

4. создание небольшого проекта на python, в том числе

— база типа запуска hello world, if name == main, f-строк

— три варианта запуска скрипта

— чтение из CSV файла с разделителем "точка с запятой" ФИО и логины

— обработка исключений, в том числе re-raise

— google docstring

— requirements.txt и pip freeze

— проверка наличие логинов на gitlab.com

— разница mv и git mv

— правильная структура проекта

— постоянное использование tab, ctrl+R и прочих практик ускорения работы

— колёсико мышки для вставки буфера выделения

5. создание тестов к проекту с помощью pytest и фикстуры-файла


Код на gitlab. Мой bash конфиг.

В телеграм-канале разбираем разные нюансы из жизни разработчика на Python и не только — python, bash, linux, тесты, командную разработку. Есть разборы фрагментов кода, где в нескольких постах описывается превращение кода "как попало" в хороший. Есть обзоры тенденций (например, выдержки из stackoverflow survey или обзор тенденций систем контроля версий на рынке). Популярен пост как разработчику исследовать предметную область, чтобы не велосипедить и пользоваться топовыми научными достижениями.


На ютуб-канале вы ещё можете посмотреть видео про атаку forkbomb в docker или идеальный скрипт на bash.

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