Лайфхаки

Маленькие, полезные хитрости

Рефакторинг приложений Python для простоты. От беспорядка к ясности: рефакторинг кода Python с помощью одной команды

03.06.2023 в 18:26

Рефакторинг приложений Python для простоты. От беспорядка к ясности: рефакторинг кода Python с помощью одной команды

Написание чистых и элегантных кодовых баз — недооцененный навык программирования. Многие программисты, особенно новички, просто сосредотачиваются на правильном понимании своих основ.

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

Это происходит только тогда, когда они в конечном итоге переходят к совместным проектам, где после месяцев (если не лет) беспорядочных и неэлегантных привычек программирования приходится приспосабливаться к «правильным» методам программирования.

Рефакторинг кода — неотъемлемая часть процесса разработки программного обеспечения, но его часто упускают из виду или им пренебрегают.

Рефакторинг приложений Python для простоты. От беспорядка к ясности: рефакторинг кода Python с помощью одной команды

Схематическая иллюстрация рефакторинга

На самом деле, Zen Python гласит:

Если реализацию трудно объяснить, это плохая идея. Если реализацию легко объяснить, это может быть хорошей идеей.

Хотя понятно, что рефакторинг кода — это не то занятие, которого ждут с нетерпением, тем не менее, он важен по целому ряду причин. Например, вы можете поддерживать свою кодовую базу в чистоте и порядке, экономя время и усилия в долгосрочной перспективе.

Чтобы упростить задачу, не было бы неплохо иметь инструмент, который мог бы выделить потенциальные области рефакторинга, чтобы мы могли просмотреть их вручную?

Поэтому в этом блоге продемонстрируем, как вы можете провести рефакторинг кода с помощью Sourcery — автоматического инструмента рефакторинга кода, который делает ваш код более понятным, кратким и понятным на Python.

Установка и настройка

Вы можете использовать Sourcery в качестве плагина IDE в VS Code и PyCharm, интерфейсе командной строки (CLI), Sublime Text, Vim, GitHub и некоторых других.

В этом блоге мы сосредоточимся конкретно на использовании Sourcery в IDE и CLI.

Как придумать код на питоне. Что значит «питонический»?

Python более 30 лет. За это время накоплен огромный опыт его применения в самых разных задачах. Этот опыт обобщался, и возникали лучшие практики, которые обычно называют «питоническим» кодом.

Философия Python раскрывается в The Zen of Python Тима Питерса, доступной в любом Python по команде import this в REPL:

>>> import this The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. Special cases aren't special enough to break the rules. Although practicality beats purity. Errors should never pass silently. Unless explicitly silenced. In the face of ambiguity, refuse the temptation to guess. There should be one-- and preferably only one --obvious way to do it. Although that way may not be obvious at first unless you're Dutch. Now is better than never. Although never is often better than *right* now. If the implementation is hard to explain, it's a bad idea. If the implementation is easy to explain, it may be a good idea. Namespaces are one honking great idea -- let's do more of those!

Начинающих в Python больше всего раздражает красота Zen of Python . В Zen передаётся дух того, что значит «питонический» — и без явных советов. Вот первый принцип дзена Python: «Красивое лучше, чем уродливое». Согласен на 100%! Но как сделать красивым мой некрасивый код? Что это вообще такое — «красивый код»?

Сколь бы ни раздражала эта неоднозначность, именно она делает Zen of Python таким же актуальным, как и в 1999 году, когда Тим Питерс написал этот набор руководящих принципов. Они помогают понять, как отличать питонический и непитонический код, и дают ментальную основу принятия собственных решений.

Каким же будет определение слова «питонический»? Лучшее найденное мной определение взято из ответа на вопрос «Что означает «питонический» В этом ответе питонический код описывается так:

Код, где правилен не только синтаксис, но соблюдаются соглашения сообщества Python, а язык используется так, как он должен использоваться.

Из этого делаем два ключевых вывода:

    Слово «питонический» связано скорее со стилем, чем с синтаксисом. Хотя идиомы Python часто имеют последствия за рамками чисто стилистического выбора, в том числе повышение производительности кода.

    То, что считается «питоническим», определяется сообществом Python.

Итак, у нас сложилось хотя бы какое-то представление о том, что имеют в виду программисты на Python, называя код «питоническим». Рассмотрим три конкретных и доступных способа написания более питонического кода.

Есть ли ошибка в следующем заголовке функции? def func(a=10, b):. Решение модул. 2 Поколение Python: для продвинутых

Модуль 15.2 (Функции с переменным количеством аргументов) курса «Поколение Python: курс для продвинутых» курс расскажет о:

  • Позиционные аргументы
  • Необязательные аргументы

def f(n=3):return n + 7

print(f(f(f())))

24

Какое количество аргументов может принять следующая функция?

def func(x, y, *args):

два и больше

Какое значение выведет на экран следующий код?

def func(x, y, *args):return len(args)

print(func(10, 20, 30, 40, 50, 60))

4

Какое значение выведет на экран следующий код?

def func(*args):return max(args) + min(args)

print(func(10, 15, *, *(17, 28, 19, 100), 13, 12))

101

Как следует именовать в определении функции параметр, призванный получать при вызове все позиционные аргументы ?

*args

Как следует именовать в определении функции параметр, призванный получать при вызове все именованные аргументы ?

**kwargs

Выберите правильное объявление функцииfunc(), чтобы можно было успешно выполнить следующие вызовы функции:

func(5, 6, 13, 17, 56)

func(2, 7)

def funс(*args)

Каков правильный порядок использования аргументов*args,**kwargsи позиционных аргументовfargsв заголовке функцииfunc?

func(fargs, *args, **kwargs)

Напишите функциюcount_args(), которая принимает произвольное количество аргументов и возвращает количество переданных в нее аргументов.

Примечание 1. Обратите внимание, что функция должна принимать не список, а именно произвольное количество аргументов.

def count_args(*args): return len(args)

Напишите функциюsq_sum(), которая принимает произвольное количество числовых аргументов и возвращает сумму их квадратов.

def sq_sum(*args): sp= return sum(sp)

Напишите функциюmean(), которая принимает произвольное количество аргументов и возвращает среднее арифметическое переданных в нее числовых (intилиfloat) аргументов.

def mean(*args): lst = try: return sum(lst)/len(lst) except: return 0.0

Напишите функциюgreet(), которая принимает произвольное количество аргументов строк имен (как минимум одно) и возвращает приветствие в соответствии с образцом.

def greet(pal, *args): folk = ' and '.join((pal,) + args) return f"Hello, {folk}!"

Напишите функциюprint_products(), которая принимает произвольное количество аргументов и выводит список продуктов (любая непустая строка) по образцу:) (нумерация продуктов начинается с единицы). Если среди переданных аргументов нет ни одного продукта, необходимо вывести текстНет продуктов.

def print_products(*products): filtered = if filtered: for indx, product in enumerate(filtered, 1): print(f"{indx}) {product}") else: print("Нет продуктов")

Напишите функциюinfo_kwargs(), которая принимает произвольное количество именованных аргументов и печатает именованные аргументы в соответствии с образцом:: , при этом имена аргументов следуют в алфавитном порядке (по возрастанию).

Рефакторинг кода Python онлайн. Инструменты рефакторинга

Представляем вам подборку инструментов, которые помогут эффективно рефакторить код:

  • Stepsize . С помощью Stepsize вы можете просматривать технический долг и фрагменты кода, которые нуждаются в рефакторинге, и помечать эти данные в качестве проблемы.
  • JustCode . Благодаря быстрым рекомендациям, генерации кода, программе запуска модульных тестов и интеллектуальному рефакторингу JustCode легко вписывается в ваш естественный рабочий процесс. Другие функции JustCode включают навигацию и поиск кода, шаблоны кода и декомпиляцию для отладки.
  • Glean . Glean позволяет выполнять различные функции, такие как извлечение JSX в новые компоненты, замена компонентов класса на функциональные компоненты и наоборот, включение JSX в условия, одновременное переименование переменных состояния и их установщиков.
  • Refactoring Essentials . Рефакторинг кода C# и VB.NET становится проще с помощью этого бесплатного расширения Visual Studio с открытым исходным кодом. Ваш код становится более читабельным и качественным. Инструмент преобразует код из C# в Visual Basic и наоборот, а также предлагает предложения о том, как писать лучший код.
  • AppRefactoring . Это приложение для быстрой и безопасной проверки уникальности кода на языках Java, C#, Swift, Kotlin, JavaScript, GO, PHP, Objective-C, Typescript, Node.js. Инструмент поможет провести анализ дубликатов и пересечений, а также предоставляет отчеты для проведения рефакторинга и улучшения качества кода.

Рефакторинг кода онлайн. Отзывы

Полезный инструмент

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

Стеффан Лоусон

Back - end Разработчик

Респект разрабам!

Использую инструмент AppRefactoring для общего анализа проектов нашей компании. Инструмент помогает легко определить степень уникальности написанного кода.

Артур Уиллиамс

CTO

Мой хороший помошник

Сервис AppRefactoring стал моим "настольным" приложением помогает мне с анализом структуры моего кода в онлайн режиме. Рекомендую к использованию.

Владимир Береза

Ios Разработчик

Однозначно рекомендую

Использование инструмента помогает сделать исходный код более структурированным и понятным и выгружать его в собственный проект на GitHub.

Никита Королев

Team Lead

Замечательный инструмент

Разработчики AppRefactoring подарили нам множество полезных функций. Этот инструмент значительно ускоряет анализ исходного кода и может быть полезным как новичкам, так и опытным разработчикам

Владислав Пак

Android Разработчик

Спасибо за тулзу!

Анализ и сравнение своих проектов в AppRefactoring помогло в определении не уникальных фрагментов кода. Таких фрагментов оказалось намного больше, чем я ожидал. Пришлось многое править. Спасибо за тулзу.

Брэндон Смит

Java Разработчик

Лучше, чем вручную…

Инструмент AppRefactoring отлично помогает мне с анализом качества моего Java кода, с тем, чтобы реорганизовать и уменьшить сложность исходного кода. Это избавляет от нудного ручного труда.

Суркова Мария

Back - end Разработчик

Крутой инструмент!

Автоматический анализ исходного кода и детальные отчеты инструмента AppRefactoring упрощают уникализацию разрабатываемых приложений. А это сейчас очень важно при регистрации приложения в Google Play Market и App Store.

Хизер Джоунс

CTO

Превосходный анализатор кода…

Превосходный онлайн анализатор кода! Постоянно использую его возможности для анализа моих исходников в автоматическом режиме. Отлично справляется с поиском идентичных фрагментов кода.

Дмитрий Петров

IOS Разработчик

Дублям бой!..

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

Мэй Браун

Team Lead

Отличный инструмент

Работаю с инструментом уже более 4 месяцев, загрузили более 15 проектов моих учеников - джунов. Здесь проще анализировать их исходные коды и следить за копипастами.

Ксения Андреева

Android Разработчик

Беру на вооружение!

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

Милдред Баллард

Java Разработчик

Хороший инструмент

Тулза может помочь с тем, чтобы сделать свой код проще и легче, сравнивать программные файлы в своих проектах в онлайн режиме. Спасибо разработчикам!

Дэйл Джонсон

Java Разработчик

Обновляем легаси …

В последнее время все чаще приходится иметь дело с легаси кодом. AppRefactoring помогает с анализом и рекомендациями на модернизацию. Разрабы инструмента постоянно добавляют новые плюшечки. Рекомендую взять на вооружение.

Эмир Смирнов

CTO

Лучшее решение

В системе уже более 10-ка моих Swift проектов. Каждый новый проект анализируется и сравнивается со структурой и синтаксисом имеющихся в базе проектов. Все это автоматически и в онлайн режиме. Для меня это лучшее решение.

Def func(a=10, b):. Ключевые слова

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

Рассмотрим поподробнее улючевые слова, указанные выше.

  1. True - Представляет собой булеву истину, если заданное условие истинно, то возвращаетсяTrue. Ненулевые значения рассматриваются как true.
  2. False - Представляет булево значение false; если заданное условие ложно, то возвращаетсяFalse. Нулевое значение рассматривается как false
  3. None - обозначает нулевое значение или пустоту. Пустой список или ноль не могут рассматриваться как None .
  4. and - Это логический оператор. Он используется для проверки нескольких условий. Он возвращаетtrue, если оба условия истинны. Рассмотрим следующую таблицу истинности.

5. or - Это логический оператор в Python. Он возвращает истину, если одно из условий истинно. Рассмотрим следующую таблицу истинности.

6. not - Является логическим оператором и инвертирует значение. Рассмотрим следующую таблицу истинности.

7. assert - Это ключевое слово используется как инструмент отладки в Python . Оно проверяет правильность кода. Оно вызываетAssertionError, если в коде найдена ошибка, а также печатает сообщение об ошибке.

Пример:

Вывод:

a is dividing by Zero Runtime Exception: Traceback (most recent call last): File "/home/40545678b342ce3b70beb1224bed345f.py", line 4, in assert b != 0, "Divide by 0 error" AssertionError: Divide by 0 error

8. def - Это ключевое слово используется для объявления функции в Python . Если за ним следует имя функции.

def my_func(a,b): c = a+b print(c) my_func(10,20)

Вывод:

30

9. class - Используется для представления класса в Python. Класс - это чертеж объектов. Он представляет собой коллекцию переменных и методов. Рассмотрим следующий класс.

class Myclass: #Variables…….. def function_name(self): #statements………

10. continue - Используется для остановки выполнения текущей итерации. Рассмотрим следующий пример.

a = 0 while a

Вывод:

1 3 4

11. break - Используется для завершения выполнения цикла и передачи управления в конец цикла. Рассмотрим следующий пример.

for i in range(5): if(i==3): break print(i) print("End of execution")

Вывод:

0 1 2 End of execution

12. If - Используется для представления условного оператора. Выполнение определенного блока определяется оператором if . Рассмотрим следующий пример.

i = 18 if (1

Вывод:

I am less than 18

13. else - Оператор else используется вместе с операторомif. Если операторifвозвращаетfalse, то выполняется блокelse. Рассмотрим следующий пример.

n = 11 if(n%2 == 0): print("Even") else: print("odd")

Вывод:

Odd

14. elif - Это ключевое слово используется для проверки нескольких условий. Это сокращение от else-if . Если предыдущее условие ложно, то проверка выполняется до тех пор, пока не будет найдено истинное условие. Приведем следующий пример.

marks = int(input("Enter the marks:")) if(marks>=90): print("Excellent") elif(marks=75): print("Very Good") elif(marks=60): print("Good") else: print("Average")

Вывод:

Enter the marks:85 Very Good

15. del - Используется для удаления ссылки на объект. Рассмотрим следующий пример.

a=10 b=12 del a print(b) # a is no longer exist print(a)

Вывод:

12 NameError: name 'a' is not defined

16. try, except - try-except используется для обработки исключений. Исключения - это ошибки времени выполнения. Рассмотрим следующий пример.