- What this tutorial is about
- What this tutorial is not about
- Before you start
- Highliting code style violations
- Code inspections and their settings
- Highlighting errors
- Meet Hector
- Quick-fixes + intentions once more
- Generating source code
- Reformatting code
- Adding documentation comments
- Type hinting
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 a 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. To learn more about the Python language, please refer to the official website.
Make sure that
- You are working with PyCharm version 2.7 or later. If you still do not have PyCharm, download it from this page. To install PyCharm, follow the instructions, depending on your platform.
- You have created a Python project (File→New Project). Refer to the product documentation, and to the Getting Started guide.
- You have created two directories src and test_dir (File→New or Alt+Insert). To learn about creating directories, refer to the product documentation.
- You have added Python files to the src and test_dir directories of your project(File→New or Alt+Insert). To learn about creating files, refer to the section Populating Projects
Open a new Python file for editing (F4). The file by default has two lines: the author and the project names. These lines appear because the file Solver.py is created by a file template that (in the case of Python files) contains definitions of these variables.
Next, start typing the keyword class. When you just start typing, PyCharm immediately shows the suggestion list to complete your code:
(Refer to Code Completion page of the product documentation for details.)
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 your mouse pointer over this curve, you see the error decription ("Colon expected"). Also, mind the red error stripe in the right gutter - it also marks the same error:
OK, 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.
However, by default these violation are but week warnings, and as such, are not visible. So, at first, let's raise their importance. Click on the mail toolbar, and on the Inspections page of the Settings/Preferences dialog, type PEP8 to find all PEP8-related inspections, and from the Severity drop-down list, choose Warning:
Apply changes and close the dialog. Now let's return to our source code.
Now PyCharm shows its best! It stands on guard to protect your code style integrity. You immediately note that indented space is highlighted, and, when you type the next statement, for example, def demo(self,a,b,c):, PyCharm will show the message from the PEP8 inspection:
So, as you can see, PyCharm supports PEP8 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:
Btw, look at the Inspections page more attentively. If you have just opened this page, you see 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) - can we actually produce code with typos?
This is how it's done...
First, let's define the two scopes. To do that, click on the main toolbar, and in the Settings/Preferences dialog box, open the page Scopes.
Then click and choose scope type Local:
In the Add New Scope dialog box, type the scope name (Test), and then, in the project tree, choose the directory to be included in the Test scope, test_dir. Note that the Pattern field is filled in automatically, as you select the directory:
Repeat this process to create the Production scope.
Next, let's create a copy of the default profile (though this profile is editable... just to be on the safe side):
and 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.
With this new profile selected, let's locate the Spelling inspection and change it. To find the Spelling inspection (we've already done it before), just type spel in the search area.
What's next? Click to add the Test scope, then once more to add the Production scope:
In the scope "Test", the inspection severity is left as is (a typo); however, the the scope "Production" we'll choose "Error" from the list of severities:
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 changes and close the dialog...
So, the modified inspection profile is ready. Its name is MyProjectProfile, and it has different settings for the Spelling inspection in the Test and Production scopes. Next, let's inspect code against this profile. To do that, choose Code→Inspect Code on the main menu, and in the dialog box, choose the desired profile and 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)
Compare the inspection results for the two scopes:
As you can see, the typos in the files belonging to the Production scope are marked with the red curvy line, while in the Test scope the typos can be tolerated, and as such are marked green.
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:
Anyway, you can change the error highlighting with some aid from Hector.
Look at the guy at the very bottom of the PyCharm window:
His name is Hector-the-Inspector, and he is responsible for inspecting code. If you click Hector, you will see the pop-up window with the Highlighting level slider:
If you are sure of yourself, move the slider to the left, to the positions Syntax or None. In the position Syntax, only syntax highlighting is provided, and Hector turns half-face. In the position None, neither syntax highlighting, nor inspection is performed - your editing becomes much faster, but less comfortable; Hector fades.
This way you can change inspection behavior for the current file only. If you open a different file for editing, it will have a different inspection behavior, and Hector will look differently.
Have you noticed a yellow or red light bulb popping up whenever you less expect it?
The yellow light bulb means that PyCharm suggests to alter your code. This happens, when no errors are encountered, but you can do something to improve your code, for example, add a documentation comment. The other option is a so-called "create from usage". For example, you refer to a method that does not yet exist, and PyCharm suggests to create it.
The red light bulb means that PyCharm has run into an error, and suggests to fix it. For example, if an import statement is required, or a resource is missing, PyCharm suggests a quick way to fix these problems.
There can be numerous types of modifications or fixes, and they are shown in a suggestion list. To bring the suggestion list forward, you can:
- Click the bulb icon
- Press Alt+Enter
To learn more about the intention actions, refer to the section Intention Actions of online help.
PyCharm provides lots of possibilities to automatically generate code. You can explore the auto-generation features in the product documentation and in the Auto-generating code tutorial. 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:
Great! PyCharm has stubbed out a 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:
Next, 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. OK, let's type it anyway, and see how PyCharm copes with it:
So, we've come to the source code like this:
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. How PyCharm will help completing this task?
Let's surround a block of code with if construct. Select the statements to be completed, when d is non-negative:
Then, press Ctrl+Alt+T, or choose Code→Surround With on the main menu. PyCharm shows a pop-up list of the possible constructs:
Select if option from the suggestion list. As you see, PyCharm automatically adds if True: and indents the selected lines:
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 clause here, and see PyCharm reporting about the expected indentation:
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:
Let's look again at our Solver.py file. Its right gutter shows lots of yellow stripes. When you hover your mouse pointer over a stripe, PyCharm shows the description of the corresponding problem in the code:
The good news is that they are but warnings, and won't affect the results. Bad news is they are too numerous to fix each one by one. Is it possible to make the source code nice and pretty without much fuss?
PyCharm says - yes. This is the code reformatting feature. So let's try to change formating of the entire file.
So, to invoke reformatting, just press Ctrl+Alt+L, or choose Code→Reformat Code on the main menu. In the Reformat Code dialog box, specify that you are going to change formatting of the current file only - and off we go! The PEP8-related errors are all gone.
Note that you can define formatting rules yourself. To do that, open the code style settings, select language (in this case, Python), and make the necessary changes:
OK, formatting is fixed now, but there are still some yellow stripes left. If you hover your mouse pointer over sich a stripe, it is most likely to see something like "Missing docstring". The inevitable yellow light bulb also shows the possibility to add a docstring comment:
Let's do it! Choose Insert docstring from the suggestion list, and PyCharm adds a documentation comment in the format ReStructuredText:
Note that there are several docstring formats, and the documentation comments are created in the format, which you have selected in the Python Integrated Tools page. If you so wish, you can change the docstring format to Epytext, or plain text.
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:
By the way, mind code completion in the documentation comments!
Next, when you look at the method invokation, you see that the wrong parameter is highlighted by the PyCharm's inspection "Type Checker":
Learn more about type hinting in the PyCharm documentation.
You've passed another tutorial:
- You've refreshed your knowledge about error and syntax highlighting, intention actions/quick fixes, code generation and auto-import.
- You've learnt about code inspections and their settings.
- You've tried hands-on creating new inspection profile and modifying it for the different scopes.
- You've reformatted your code to meet PEP8 requirements.
- You've created a documentation comment for a method and used type hinting.