Плагины, горячие клавиши, настройки для PyCharm
Всем привет! Перед самим списком плагинов, горячих клавиш и т. п. небольшой дисклеймер.
Думаю каждый разработчик хоть раз встаёт перед трудным вопросом: Где и как писать код? Многие «тру» программисты тут же ответят: VIM NVIM и другие консольные редакторы. Но мы то с вами нормальные люди и хотим разрабатывать с удобством и комфортом. Хотим облегчить процесс кодинга.
Именно поэтому, многие программисты и отдают предпочтение ide’шкам, а не консольным редакторам.
После установки любой современной ide, у вас наверняка наступает ощущение абсолютной радости (особенно, если вы раньше вообще не программировали). Но после первых пары дней, вы узнаете о такой потрясающей вещи как плагины. Да. Это то, что может сделать опыт работы с ide ещё более простым, понятным, комфортным.
Когда я только начинал свой путь в разработке, я решил использовать PyCharm (соотвественно, для разработки на Python). И по моему глубокому убеждению не прогадал. PyCharm относительно лёгкая, относительно минималистичная ide’шка. Но не смотря на это, PyCharm — мощнейший инструмент для написания кода. Всё, начиная от подсветки синтаксиса и подсказок типов и заканчивая возможностью делать рефакторинг за одно сочетание клавиш, приводить весь код к единому стандарту, подключаться к базе данных и FTP/SSH, всё это может делать наш горячо любимый PyCharm.
Так зачем же тогда такому прекрасному редактору ещё и плагины? Всё очень просто, плагины позволяют нам добавить узкоспециализированные фичи, который просто не помещаются в стандартную «библиотеку» PyCharm.
Но в интернете практически нет статей посвящённых набору крутых плагинов, такие статьи разбросаны по всему интернету и найти в них ценный материал крайне сложно, поэтому, надеюсь, эта статья и станет своего рода базой, единым топом крутых плагинов для наших любых ide от JetBrains и для PyCharm в частности.
Итак, начнём с плагинов, я буду перечислять их примерно отсортировав по степени важности (по моему мнению).
Топ плагинов для PyCharm:
- Tabnine — подсказки с использованием ИИ. Очень крутой плагин, сильно помогает при написании кода, использую всегда.
- Translation — супер полезный плагин, позволяет запустить переводчик прямо из кода. Использование: выделить нужный текст, нажать ПКМ и выбрать Translate/Translate and Repace. Либо нажать в правом верхнем углу на иконку перевода.
- PyLint — линтер для Python, указывает на плохой код. Использование: выбрать в нижнем меню PyLint и запустить проверку.
- MyPy — проверка типов в Python (чтобы не допускать ошибки связанные с типом возвращаемых значений). Использование: выбрать в нижнем меню MyPy и запустить проверку.
- SonarLint — указывает на различные ошибки в нейминге переменных/функций/классов. Использование: Ctrl+Shift+S или выбрать в нижнем меню SonarLint и запустить проверку.`
- Python Security — проверяет код на уязвимости, работает автоматически.
- Quick File Preview — посмотреть файл не открывая его, полезен если вы постоянно бегаете по файлам в поисках буквально 1 строчки и нет смысла полностью открывать файл (в данный момент этот функционал уже реализован в PyCharm:https://www.jetbrains.com/help/idea/2020.3/using-code-editor.html#preview-tab). Использование: Один раз кликнуть на файл.
- String Manipulation — работа с названиями переменных/функций и т. п. (можно привести к snake_case, camelCase и т. п.), Использование: выделить нужное слово, нажать ПКМ, нажать String Manipulation, нажать Switch Case и выбрать нужный пункт.
- Rainbow Brackets — красит скобочки в свой цвет, нужно чтобы чётко видеть иерархию скобок.
- Python Smart Execute — запустить блок кода в консоли, не запуская при этом саму программу (к примеру для теста на работоспособность). Использование: выделить код и Alt+Shift+A, или нажать ПКМ и выбрать Smart execute.
- MultiHighlight — выделить какое-либо название цветом (к примеру чтобы не забыть отрефакторить этот кусок). Использование: Выделить кусок и нажать Ctrl+’
- Dummy Text Generator — сгенерировать рандомное предложение в различных стилях. Бывает полезно для теста функционала (к примеру, что текст отображения не вылазит за рамки). Использование: Нажать ПКМ, выбрать Generate (либо Alt+Insert), выбрать Generate Dummy Text.
- Randomness — сгенерировать случайное число, строку и т. п. Использование: нажать Alt+R и выбрать нужное действие.
- CodeGlance — добавляет карту с кодом в правую часть окна.
- Extra Icons — изменяет стандартные иконки. Использование: Включить Settings/Appearance Behavior/Extra Icons
- Mario Progress Bar — изменяет стандартный прогресс бар на марио.
Теперь предлагаю перейти на интересные сочетания клавиш, которые позволят вам быстрее выполнять стандартные действия, да и просто ускорят вашу разработку (кнопки для обычной, НЕ МАКОВСКОЙ клавиатуры).
- Ctrl+Alt+S — Перейти в настройки (откроется та часть где вы остановились).
- Ctrl+Shift+Стрелочки (вверх, вниз) — Переместить строчку вверх или вниз.
- Ctrl+D/Y — Дублировать строчку/Удалить строчку.
- Alt+Enter — Привести код к принятым стандартам (для Python — PEP8).
- Ctrl+B — Переместиться к реализации данного класса/метода и т. п.
- Ctrl+R — Изменить название класса/функции и т. п. по всему проекту.
- Double tap on Shift — поиск в классе, функции, файле, PyCharm action или везде.
- Ctrl+J — Использовать шаблон кода.
- Alt+Enter — произвести настройку класса/функции и т. п. (к примеру указать типы принимаемых и возвращаемых значений).
- Ctrl+E — Навигация по файлам (отображает список файлов в хронологическом порядке).
- Ctrl+Alt+M — Объединить выделенный код в функцию/метод.
- Ctrl+N — Найти класс/метод и т. п. по названию (по всем местам).
- Ctrl+Shift+N — Найти файл по названию (по всем местам).
- Alt+F7 — Посмотреть где используется класс/метод/функция и т. п.
- Ctrl+F12 — Показывает структура файла (класса, функции и т. п).
Думаю про горячие клавиши всё понятно, тут главное не спутать их 🙂
Под конец предлагаю рассмотреть интересные настройки, которые улучшат ваш опыт работы с ide.
- Настроить интерпретатор. Тут вы сможете изменить версию Python, добавить библиотеки и ещё много чего интересного. File -> Settings -> Project: -> Project Interpreter
- Изменить шрифты, размеры и т. д. File -> Settings -> editor -> font
- Поменять цветовую схему UI. File -> Settings -> editor -> color scheme
- Deploy на сервер. Эта настройка открывает нам целый мир удобного деплоя, если будет интересно, могу написать отдельную статью просвещённую деплою. Tools -> Deployment -> Configuration
- Добавление плагинов. File -> Settings -> Plugins
- Это не совсем настройка, но всё же находится в меню, так что я решил добавить это сюда. Позволяет посмотреть небольшую статистику своей продуктивности. Help -> MyProductivity
На этом основные настройки заканчиваются, да их не так много как тех же плагинов или хоткеев, но для начала думаю достаточно.
Спасибо что прочитали эту статью, надеюсь вы смогли подчерпнуть с неё нечто новое.
Пишите свои крутые плагины, хоткеи, настройки, если сообществу понравится я обязательно добавлю их в статью.
Объектно-ориентированное программирование
Python имеет множество встроенных типов, например, int, str и так далее, которые мы можем использовать в программе. Но также Python позволяет определять собственные типы с помощью классов . Класс представляет некоторую сущность. Конкретным воплощением класса является объект.
Можно еще провести следующую аналогию. У нас у всех есть некоторое представление о человеке, у которого есть имя, возраст, какие-то другие характеристики Человек может выполнять некоторые действия — ходить, бегать, думать и т.д. То есть это представление, которое включает набор характеристик и действий, можно назвать классом. Конкретное воплощение этого шаблона может отличаться, например, одни люди имеют одно имя, другие — другое имя. И реально существующий человек будет представлять объект этого класса.
Класс определяется с помощью ключевого слова class :
class название_класса: атрибуты_класса методы_класса
Внутри класса определяются его атрибуты, которые хранят различные характеристики класса, и методы — функции класса.
Создадим простейший класс:
class Person: pass
В данном случае определен класс Person, который условно представляет человека. В данном случае в классе не определяется никаких методов или атрибутов. Однако поскольку в нем должно быть что-то определено, то в качестве заменителя функционала класса применяется оператор pass . Этот оператор применяется, когда синтаксически необходимо определить некоторый код, однако мы не хотим его, и вместо конкретного кода вставляем оператор pass.
После создания класса можно определить объекты этого класса. Например:
class Person: pass tom = Person() # определение объекта tom bob = Person() # определение объекта bob
После определения класса Person создаются два объекта класса Person — tom и bob. Для создания объекта применяется специальная функция — конструктор , которая называется по имени класса и которая возвращает объект класса. То есть в данном случае вызов Person() представляет вызов конструктора. Каждый класс по умолчанию имеет конструктор без параметров:
tom = Person() # Person() - вызов конструктора, который возвращает объект класса Person
Методы классов
Методы класса фактически представляют функции, которые определенны внутри класса и которые определяют его поведение. Например, определим класс Person с одним методом:
class Person: # определение класса Person def say_hello(self): print("Hello") tom = Person() tom.say_hello() # Hello
Здесь определен метод say_hello() , который условно выполняет приветствие — выводит строку на консоль. При определении методов любого класса следует учитывать, что все они должны принимать в качестве первого параметра ссылку на текущий объект, который согласно условностям называется self . Через эту ссылку внутри класса мы можем обратиться к функциональности текущего объекта. Но при самом вызове метода этот параметр не учитывается.
Используя имя объекта, мы можем обратиться к его методам. Для обращения к методам применяется нотация точки — после имени объекта ставится точка и после нее идет вызов метода:
объект.метод([параметры метода])
Например, обращение к методу say_hello() для вывода приветствия на консоль:
tom.say_hello() # Hello
В итоге данная программа выведет на консоль строку «Hello».
Если метод должен принимать другие параметры, то они определяются после параметра self , и при вызове подобного метода для них необходимо передать значения:
class Person: # определение класса Person def say(self, message): # метод print(message) tom = Person() tom.say("Hello METANIT.COM") # Hello METANIT.COM
Здесь определен метод say() . Он принимает два параметра: self и message. И для второго параметра — message при вызове метода необходимо передать значение.
self
Через ключевое слово self можно обращаться внутри класса к функциональности текущего объекта:
self.атрибут # обращение к атрибуту self.метод # обращение к методу
Например, определим два метода в классе Person:
class Person: def say(self, message): print(message) def say_hello(self): self.say("Hello work") # обращаемся к выше определенному методу say tom = Person() tom.say_hello() # Hello work
Здесь в одном методе — say_hello() вызывается другой метод — say() :
self.say("Hello work")
Поскольку метод say() принимает кроме self еще параметры (параметр message), то при вызове метода для этого параметра передается значение.
Причем при вызове метода объекта нам обязательно необходимо использовать слово self , если мы его не используем:
def say_hello(self): say("Hello work") # ! Ошибка
То мы столкнемся с ошибкой
Конструкторы
Для создания объекта класса используется конструктор. Так, выше когда мы создавали объекты класса Person, мы использовали конструктор по умолчанию, который не принимает параметров и который неявно имеют все классы:
tom = Person()
Однако мы можем явным образом определить в классах конструктор с помощью специального метода, который называется __init__() (по два прочерка с каждой стороны). К примеру, изменим класс Person, добавив в него конструктор:
class Person: # конструктор def __init__(self): print("Создание объекта Person") def say_hello(self): print("Hello") tom = Person() # Создание объекта Person tom.say_hello() # Hello
Итак, здесь в коде класса Person определен конструктор и метод say_hello() . В качестве первого параметра конструктор, как и методы, также принимает ссылку на текущий объект — self. Обычно конструкторы применяются для определения действий, которые должны производиться при создании объекта.
Теперь при создании объекта:
tom = Person()
будет производится вызов конструктора __init__() из класса Person, который выведет на консоль строку «Создание объекта Person».
Атрибуты объекта
Атрибуты хранят состояние объекта. Для определения и установки атрибутов внутри класса можно применять слово self . Например, определим следующий класс Person:
class Person: def __init__(self, name): self.name = name # имя человека self.age = 1 # возраст человека tom = Person("Tom") # обращение к атрибутам # получение значений print(tom.name) # Tom print(tom.age) # 1 # изменение значения tom.age = 37 print(tom.age) # 37
Теперь конструктор класса Person принимает еще один параметр — name. Через этот параметр в конструктор будет передаваться имя создаваемого человека.
Внутри конструктора устанавливаются два атрибута — name и age (условно имя и возраст человека):
def __init__(self, name): self.name = name self.age = 1
Атрибуту self.name присваивается значение переменной name. Атрибут age получает значение 1.
Если мы определили в классе конструктор __init__, мы уже не сможем вызвать конструктор по умолчанию. Теперь нам надо вызывать наш явным образом опреледеленный конструктор __init__, в который необходимо передать значение для параметра name:
tom = Person("Tom")
Далее по имени объекта мы можем обращаться к атрибутам объекта — получать и изменять их значения:
print(tom.name) # получение значения атрибута name tom.age = 37 # изменение значения атрибута age
В принципе нам необязательно определять атрибуты внутри класса — Python позволяет сделать это динамически вне кода:
class Person: def __init__(self, name): self.name = name # имя человека self.age = 1 # возраст человека tom = Person("Tom") tom.company = "Microsoft" print(tom.company) # Microsoft
Здесь динамически устанавливается атрибут company, который хранит место работы человека. И после установки мы также можем получить его значение. В то же время подобное определение чревато ошибками. Например, если мы попытаемся обратиться к атрибуту до его определения, то программа сгенерирует ошибку:
tom = Person("Tom") print(tom.company) # ! Ошибка - AttributeError: Person object has no attribute company
Для обращения к атрибутам объекта внутри класса в его методах также применяется слово self:
class Person: def __init__(self, name): self.name = name # имя человека self.age = 1 # возраст человека def display_info(self): print(f"Name: Age: ") tom = Person("Tom") tom.display_info() # Name: Tom Age: 1
Здесь определяется метод display_info(), который выводит информацию на консоль. И для обращения в методе к атрибутам объекта применяется слово self: self.name и self.age
Создание объектов
Выше создавался один объект. Но подобным образом можно создавать и другие объекты класса:
class Person: def __init__(self, name): self.name = name # имя человека self.age = 1 # возраст человека def display_info(self): print(f"Name: Age: ") tom = Person("Tom") tom.age = 37 tom.display_info() # Name: Tom Age: 37 bob = Person("Bob") bob.age = 41 bob.display_info() # Name: Bob Age: 41
Здесь создаются два объекта класса Person: tom и bob. Они соответствуют определению класса Person, имеют одинаковый набор атрибутов и методов, однако их состояние будет отличаться.
При выполнении программы Python динамически будет определять self — он представляет объект, у которого вызывается метод. Например, в строке:
tom.display_info() # Name: Tom Age: 37
Это будет объект tom
bob.display_info()
Это будет объект bob
В итоге мы получим следующий консольный вывод:
Name: Tom Age: 37 Name: Bob Age: 41
Не получается импортировать класс
Привет. У меня есть класс CStatistics , который необходимо импортировать. Данный класс находится по адресу: DataUnloader/Statistic/CStatistics.py Скрипт, в который должен произойти импорт находится по адресу: ./ (на скрине Quality ) Чтобы было понятнее, я прикреплю скрин: Проблема в том, что указанный класс не подцепляется. Логично, что нужно сделать так:
import DataUnloader.Statistic.SStatistics
чтобы его подцепить. Но это не помогает Здесь задавался подобный вопрос. Он совпадает с моим мнением. Но это не помогло решить проблему. Подскажите, как сделать импорт? PyCharm , в котором я веду разработку, не хочет даже видеть DataUnloader :
Отслеживать
задан 6 апр 2017 в 11:32
hedgehogues hedgehogues
9,411 8 8 золотых знаков 49 49 серебряных знаков 99 99 бронзовых знаков
Эм. У вас в папке лежит «CStatistics» а вы импортируете «SStatistics»
6 апр 2017 в 12:12
@Alban Пардон, в скрине ошибка. Но факт в том, что даже DataUnloader он не видит.
6 апр 2017 в 12:26
@Alban что он сделает?
6 апр 2017 в 12:44
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
во-первых, в PyCharm можно помечать директорию как source root, что позволяет ему видеть директории ниже
во-вторых, я не вижу в Вашей иерархии __init__.py -файлов, они нужны, чтобы Python и PyCharm знали, что это не просто директория, а пакет с модулями, без них импорт не сработает как нужно
Отслеживать
ответ дан 6 апр 2017 в 14:14
Azat Ibrakov Azat Ibrakov
196 6 6 бронзовых знаков
Используйте следующею конструкцию:
import sys sys.path.append(r"/путь/к/каталогу/в/котором/лежит/модуль") import name # Где name название модуля в этом каталоге
К примеру есть python файл в который вам необходимо импортировать модуль под названием My_class .
Python file лежит на рабочем столе. Модуль также на рабочем толе, но по пути: /test/test_2/ и содержит в себе следующее:
def check(): print('Im here!')
import sys sys.path.append(r"C:\Users\user\Desktop\test\test_2") import My_class My_class.check() # Проверяем
Видим что всё работает:
Im here!
Перенос методов класса в PyCharm
— Доброго всем времени суток! Мой вопрос к знатокам PyCharm.
Все проекты имеют свойство расти. Вот и у меня в одном классе накопилось уже очень много методов.
Начинаю путаться в них. Да и листать их довольно утомительно.
Пробовал сворачивать методы, чтобы занимали меньше пространства. Но они имеют тенденцию самопроизвольно
разворачиваться, когда это менее всего нужно. Закономерность этого явления пода не уловил.
Вопрос: —
Можно ли в PyCharm часть методов класса перенести в другой модуль (файл)?
Кстати:
Есть ли в PyCharm средства АВТОМАТИЧЕСКИ сворачивать ВСЕ методы Модуля или всего Проекта?
Буду очень благодарен!
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Специфика описания методов класса и инициализации объектов на примере класса Date
Создайте класс Date, который будет содержать информацию о дате (день, месяц, год). С помощью.
Как вынести описание методов вложенного класса за пределы класса?
Подскажите, пожалуйста, как мне вынести описание методов вложенного класса за пределы класса?
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
Сообщение от Staut
Можно ли в PyCharm часть методов класса перенести в другой модуль (файл)?
Можно, но, в твоем случае, не нужно.
Ты уже написал божественный объект и пожинаешь все его прелести. Т.е. проблема в архитектуре.
Регистрация: 26.07.2013
Сообщений: 481
— Не думаю avgoor. Старался структурировать, как только мог .
Задача тоже не из простых. Японский кроссворд.
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
Staut, И что не получается структурировать?
Регистрация: 26.07.2013
Сообщений: 481
— Даже не знаю что ответить avgoor.
Задачку, конечно, знаете. Строки и столбцы так сильно завязаны друг на друга. Пробую уже не первый вариант решения.
Все равно получается клубок.
— Хотелось как-то разложить по отдельности. То, что занимается этим — туда, а то что занимается тем — туда.
В C++ это делается проще.
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
Сообщение от Staut
Задачку, конечно, знаете.
Задачку знаю.
Сообщение от Staut
Хотелось как-то разложить по отдельности. То, что занимается этим — туда, а то что занимается тем — туда.
Так об том и речь.
Поясните задачу конкретнее, что именно делает ваш класс? (отображение, сохранение)
Регистрация: 26.07.2013
Сообщений: 481
— Скорее отображение, avgoor. Запись значений в Ячейки кроссворда. Но запись в строку, влечет за собой —
запись в столбец, и наоборот. Здесь мне самому надо разбираться.
— Я задавал просто технический вопрос. Можно ли в PyCharm РАЗНОСИТЬ методы класса по файлам?
Может кто-ни-будь знает, как это делается?
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
Сообщение от Staut
Скорее отображение, avgoor. Запись значений в Ячейки кроссворда.
Отображением должен заниматься один класс. Обменом с диском — другой. Хранением текущего состояния — третий.
Сообщение от Staut
Но запись в строку, влечет за собой —
запись в столбец, и наоборот.
Вы слышали про двумерные массивы?
4615 / 2036 / 359
Регистрация: 17.03.2012
Сообщений: 10,102
Записей в блоге: 6
Сообщение было отмечено Staut как решение
Решение
Staut, можно. Это называется refactor->move, вызывается ПКМ в редакторе или F6.
Да, божественный объект, классика жанра, но это поправимо.
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
dondublon, был у ТСа один файл, где черт ногу сломит, теперь будет два.
1727 / 967 / 199
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6
Сообщение от Staut
Можно ли в PyCharm РАЗНОСИТЬ методы класса по файлам
Сообщение от Staut
Но запись в строку, влечет за собой —
запись в столбец, и наоборот. Здесь мне самому надо разбираться
Вы просто не можете разобраться со структурой решаемой задачи. Прежде чем начинать писать программу и тем более решать вопросы разбиения класса по частям на файлы, нужно тщательно продумать алгоритм и структуру Вашей задачи. Связь строк и столбцов в кроссворде по моему вообще нужно решать не с помощью классов (причем здесь классы мне не понятно) а с помощью композиции клеток кроссворда, которые формируют строки и столбцы, при этом некоторые клетки являются одновременно частью и строки и столбца.
Или вот такой подход. Начинаем с левой верхней строки. В качестве параметра задаем позицию ее пересечения с одним из столбцов. Выясняем позицию пересечения для этого столбца. Из множества всех существующих слов (у Вас оно есть?) ищем множество таких пар слов, что в соответствующих позициях они имеют одну и ту же букву. Потом рассматриваем другое пересечение для этой строки или этого столбца, и ищем там множество пар слов. Затем для множества слов для строки от первого пересечения и для множества слов для этой же строки для другого пересечения ищем пересечение этих множеств. И начинаем двигаться дальше, с обратной связью действующей на первую строку, постепенно уменьшая количество слов удовлетворяющих уже рассмотренной части кроссворда.
Интересно, и для чего Вам этот геморрой? Какая практическая ценность от этой задачи? Не исключено, что эта задача имеет какой то математический алгоритм решения. Тогда все упростится, и нужно будет просто математический алгоритм оформить в виде программы.