PyCharm 2024.3 Help

Code Quality Assistance Tips and Tricks, or How to Make Your Code Look Pretty?

What this tutorial is about

This tutorial aims to walk you step by step through creating source code in a Python project, with the use of PyCharm's code intelligence features. You will see how PyCharm helps keep your source code in perfect shape, with proper indentations, spaces, imports etc. - actually, you'll see that PyCharm itself is a code quality tool.

Python programming is out of scope of this tutorial. For more information about the Python language, please refer to the official website.

Before you start

Make sure that:

  • You are working with PyCharm version 5.0 or later. If you still do not have PyCharm, download it from this page. To install PyCharm, follow the instructions, depending on your platform. For more information, refer to the product documentation.

  • You have created a Python project (File|New Project...). For more information, refer to product documentation.

  • You have created two directories src and test_dir (File|New or Alt+Insert).

  • You have added Python files to the src and test_dir directories of your project(File|New or Alt+Insert). For more information about creating files, refer to the section Populate projects.

Highlighting code style violations

Create a new Python file src/Solver.py Alt+Insert. The created file immediately opens for editing. The file by default has no contents - this is because the file Solver.py is created by a file template that (in the case of Python files) contains just nothing.

Next, start typing the keyword class. When you just start typing, PyCharm immediately shows the suggestion list to complete your code:

Code Assistance Tip

The red curve marks the next expected entry — in this case, this is the expected identifier. Enter the class name Solver. The red curve moves after the class name. If you hover over this curve, you see the error description (':' expected). Also, mind the red error stripe in the right gutter — it also marks the same error:

'Colon expected' tip

Type the colon, and press Enter. According to the Python code style, the next statement is indented. If by chance you press space after Enter, you will thus violate the code style settings.

Tuning the PEP 8 inspections

Go to Settings|Editor and on the Inspections page, type PEP 8 to find all PEP 8-related inspections. By default, PEP 8 coding style violations are not highlighted, and PEP 8 naming convention violations are but weak warnings, and as such, are not visible.

So, at first, let's raise their importance. From the Severity drop-down list, choose Warning:

Severity Change

Apply the changes and close the dialog. Now let's return to our source code.

Tracking PEP 8 rules

When you type the next statement, for example, def demo(self,a,b,c):, PyCharm will show the message from the PEP 8 inspection:

PEP 8 Inspection

So, as you can see, PyCharm supports PEP 8 as the official Python style guide. If you explore the list of inspections (Ctrl+Alt+S - Inspections), you will see that PyCharm launches the pep8.py tool on your code, and pinpoints the code style violations.

Code inspections and their settings

Look at the Inspections page more attentively. If you have just opened this page, you refer to the default inspection profile with the default settings: it means that the inspections apply to all the sources of the current project.

Let's try to customize this profile for two different scopes:

  • In the Test scope, the spelling errors should be marked as typos (green).

  • In the Production scope, the spelling errors should be marked as errors (red).

Creating scopes

First, let's define the two scopes. To do that, click on the main toolbar, in the Settings dialog expand the node Appearance and Behavior, open the page Scopes. Then click and choose scope type Local.

In the Add New Scope dialog, type the scope name (Test), and then, in the project tree, choose the directory to be included in the Test scope, test_dir. The Pattern field is filled in automatically, as you include the directory:

Creating Scope

Repeat this process to create the Production scope.

Creating inspection profile with these scopes

Next, let's create a copy of the default profile. To do it, go to Settings|Editor|Inspections, click and in the drop-down list, select Copy to Project...

Give it a new name, for example, MyProjectProfile. This new profile is a copy of the default one, and has the same set of inspections.

Copy Profile

With this new profile selected, let's locate the Typo inspection and change it.

Click In All Scopes button and select the Test scope from the list. Repeat same for the Production scope.

Set inspection for scopes

In the Test scope, the inspection severity is left as-is (a typo), however, in the Production scope we will choose Error from the list of severities:

Change inspection severity

Mind the color code of inspections. They are shown black if unchanged. If they are blue, then it means that they have been changed.

Apply the changes and close the dialog.

So, the modified inspection profile is ready. Next, let's inspect code against this profile. To do that, go to Code | Inspect Code in the main menu, and in the dialog, choose the desired profile and scope:

Inspect code against scope

Do it twice - for Test and Production scopes (if you want to preserve inspection results for further examination and sharing, you can export them). Explore results:

Inspection results

Highlighting errors

Besides coding style violations, PyCharm highlights the other errors too, depending on the selected profile.

For example, if your inspection profile includes Python inspection Unresolved references, and you use a symbol that not yet has been imported, PyCharm underlines the unresolved reference and suggests to add import statement:

Import suggestion

Generating source code

PyCharm provides lots of possibilities to automatically generate code. You can explore the auto-generation features in the product documentation. Let's explore the main code generation procedures. To do that, just delete all contents of the file Solver.py, and start from scratch.

First, create an instance of a class:

Create instance of a class

Next, press Alt+Enter and choose the intention action Create class 'Solver':

Intention action for creating a class

PyCharm has stubbed out a class:

Created class

Next, let's add a method to the class instance. To do that, type a dot after class instance, and then type the method name. This method does not yet exist, and PyCharm suggests to create one:

Create method in a class

Let's do some manual work - type the source code. When it comes to calculate the discriminant, we have to extract a square root. There is a dedicated function sqrt in the library math, but it is not yet imported. Let's type it anyway, and see how PyCharm copes with it. Press Alt+Enter and choose Import 'math':

Import suggestion

So, we've come to the source code like this:

import math class Solver(): def demo(self,a,b,c): d = b ** 2 - 4 * a * c disc = math.sqrt(d) root1 = (- b + disc) / (2 * a) root2 = (- b - disc) / (2 * a) print (root1, root2) return root1, root2

However, it lacks some significant analysis. We'd like to analyze the radicand d. If it is zero or positive, then the discriminant and the equation roots will be calculated; when the radicand is negative, let's raise an exception.

Let's surround a block of code with if construct. Select the statements to be completed, when d is non-negative, and press Ctrl+Alt+T (or select Code | Surround with from the main menu):

Surround code

Select if option from the suggestion list. As you see, PyCharm automatically adds if True: and indents the selected lines:

Surrounding added

We are not at all interested in a boolean expression, so let's change the selected True to d >= 0. Next, place the caret at the end of the last line, and press Enter. The caret rests on the next line, with the same indentation as the if statement, type else:, and see PyCharm reporting about the expected indentation:

Indent expected

When you press Enter again, the caret rests at the indented position. Here you can type the exception expression, using PyCharm's powerful automatic code completion:

Completing the code

Reformatting code

Let's look again at our Solver.py file. Its right gutter shows yellow stripes. When you hover over a stripe, PyCharm shows the description of the corresponding problem in the code:

Warnings

They are but warnings, and won't affect the results. However, PyCharm provides a way to fix them all without much fuss. This is the code reformatting feature. Let's try to change formatting of the entire file. To do that, press Ctrl+Alt+L (or select Code | Reformat Code from the main menu):

Code reformatting done

Look at the code now - the PEP 8-related drawbacks are all gone.

Note that you can define formatting rules yourself. To do that, open the code style settings, select the language (in this case, Python), and make the necessary changes:

Reformat code settings

Adding documentation comments

Formatting is now fixed, but there are still some stripes left. The inevitable yellow light bulb shows the possibility to add a docstring comment:

Insert documentation strings

Choose this suggestion and see the docstring comment for a certain parameter added:

Documentation strings added

Note that you have to select the checkbox Insert type placeholders in documentation comment strings in the Smart Keys page of the Editor settings:

Insert type placeholder settings

There are several docstring formats, and the documentation comments are created in the format, which you have selected on the Python Integrated Tools page.

Type hinting

The documentation comments can be used to define the expected types of parameters, return values, or local variables. Why do we need it all? For example, we'd like to keep under control the types of parameters we pass to the demo() method. To do that, let's add the corresponding information to the documentation comment (mind code completion in the documentation comments):

Docstrings completion

Next, when you look at the method invocation, you see that the wrong parameter is highlighted by the PyCharm's inspection Type Checker:

Type checker
Last modified: 31 October 2024