Introduction
In this article, we shall look at Pylint and how it's used to ensure that your python code conforms to PEP8 guidelines.
What is PEP8?
PEP8 is a document that provides guidelines and best practices on how to write python code, thus making the code readable and consistent.
Content
- What is Pylint
- Install Pylint
- Create a simple quiz app
- Run Pylint on our Quiz app
- Make recommended changes.
- Conclusion
What is Pylint
Pylint is a python tool that checks for errors and tries to enforce a coding standard.
Install Pylint
Install Pylint via terminal pip install pylint
or pip3 install pylint
.
Create a simple quiz app
Build a simple python quiz app which will include five quizzes from the renowned show "The Big Bang Theory", then run Pylint on it and make the recommended changes.
Procedure:
- Make a directory of the project. I named mine quiz_app.
Run
mkdir quiz_app
in your terminal - Change into your quiz_app directory.
Run
cd quiz_app
- You can create the file at this point.
Run
touch app.py
- Open Vs Code
Code .
- Open the created file and input the code below. Alternatively, you can copy the code directly from this repository.
import random
from string import ascii_lowercase
NUM_QUESTIONS_PER_QUIZ = 5
QUESTIONS = {
"How old was Sheldon when he got his first P.h.d?": [
"16",
"18",
"20",
"22",
],
"What’s Amy’s job": [
"Neurobiologist",
"Marine biologist",
"Forensic biologist",
"Microbiologist",
],
"Which couple gets married first?": [
"Bernadette and Howard",
"Penny and Leonard",
"Amy and Sheldon",
"Emily and raj",
],
"What is Leonard primary health concern?": [
"He is lactose intolerant",
"He is allergic to peanuts",
"He has to eat gluten free",
"He has diabetes",
],
"Who does Howard meet while serving Thanksgiving dinner at a shelter?": [
"Elon Musk",
"Jeff Bezos",
"Bill Gates",
"Steve Jobs",
]
}
num_questions = min(NUM_QUESTIONS_PER_QUIZ, len(QUESTIONS))
questions = random.sample(list(QUESTIONS.items()), k=num_questions)
num_correct = 0
for num, (question, alternatives) in enumerate(questions, start=1):
print(f"\nQuestion {num}:")
print(f"{question}?")
correct_answer = alternatives[0]
labeled_alternatives = dict(
zip(ascii_lowercase, random.sample(alternatives, k=len(alternatives)))
)
for label, alternative in labeled_alternatives.items():
print(f" {label}) {alternative}")
while (answer_label := input("\nChoice? ")) not in labeled_alternatives:
print(f"Please answer one of {', '.join(labeled_alternatives)}")
answer = labeled_alternatives[answer_label]
if answer == correct_answer:
num_correct += 1
print("⭐ Correct! ⭐")
else:
print(f"The answer is {correct_answer!r}, not {answer!r}")
print(f"\nYou got {num_correct} correct out of {num} questions")
Run Pylit on our quiz_app
Now, run pylint on the above code. If you are using Vs Code, launch bash and run pylint app.py
. You have to specify the python file after pylint.
Alternatively, you can run pylint on your terminal by changing into your quiz_app directory and run pylint app.py
.
After running pylint, the command window will display the Pylint results. The result is as shown below:
************* Module app
app.py:62:0: C0304: Final newline missing (missing-final-newline)
app.py:1:0: C0114: Missing module docstring (missing-module-docstring)
app.py:41:0: C0103: Constant name "num_correct" doesn't conform to UPPER_CASE naming style (invalid-name)
app.py:62:48: W0631: Using possibly undefined loop variable 'num' (undefined-loop-variable)
------------------------------------------------------------------
Your code has been rated at 8.18/10
Note that app.py:62:0, indicates what line is affected while C0304:, is a message code. In this case, the first line refers to a coding standard violation in line 62, column 0.
There are other message codes that you can get apart from the above shown. Below is a list of prefixes and their meanings.
- [R] Refactor for a "good practice" metric violation
- [C] Convention for coding standard violation
- [W] Warning for stylistic problems, or minor programming issues
- [E] Error for important programming issues (i.e. most probably bug)
- [F] Fatal for errors which prevented further processing
At the end of the result shown, there is a grading that Pylit does. This grading shows how your code conforms to PEP 8. This code received an 8.18 out of 10. Try to get it to a 10 out of 10.
Make Recommended changes
Create a new file and name it app_modified.py
. Copy the code from app.py
,which will be used to make the recommended changes.
Start with C0103: Constant name "num_correct" doesn't conform to UPPER_CASE naming style (invalid-name)
As you can see, pylint lets us know that we have to change num_correct
to uppercase. Find and replace num_correct
to NUM_CORRECT
used in three instances.
Running Pylint at this point gives us a score of 8.64 out of 10.
For C0114: Missing module docstring (missing-module-docstring)
. A docstring is a short description of what your code does, and it may include specifics on aspects of the code. It mainly occurs as the first statement in a module, function, class, or method definition.
We will add """A quiz app based on the show: The Big Bang Theory"""
at the start of our program.
For C0304: Final newline missing (missing-final-newline)
, we will add an empty line at the end of our program.
We can ignore W0631: Using possibly undefined loop variable 'num' (undefined-loop-variable)
. Since changing it will affect how our program runs.
Running Pylint at this point gives us a score of 9.55 out of 10.
Your final code will be similar to this:
"""A quiz app based on the show: The Big Bang Theory"""
import random
from string import ascii_lowercase
NUM_QUESTIONS_PER_QUIZ = 5
QUESTIONS = {
"How old was Sheldon when he got his first P.h.d?": [
"16",
"18",
"20",
"22",
],
"What’s Amy’s job": [
"Neurobiologist",
"Marine biologist",
"Forensic biologist",
"Microbiologist",
],
"Which couple gets married first?": [
"Bernadette and Howard",
"Penny and Leonard",
"Amy and Sheldon",
"Emily and raj",
],
"What is Leonard primary health concern?": [
"He is lactose intolerant",
"He is allergic to peanuts",
"He has to eat gluten free",
"He has diabetes",
],
"Who does Howard meet while serving Thanksgiving dinner at a shelter?": [
"Elon Musk",
"Jeff Bezos",
"Bill Gates",
"Steve Jobs",
]
}
num_questions = min(NUM_QUESTIONS_PER_QUIZ, len(QUESTIONS))
questions = random.sample(list(QUESTIONS.items()), k=num_questions)
NUM_CORRECT = 0
for num, (question, alternatives) in enumerate(questions, start=1):
print(f"\nQuestion {num}:")
print(f"{question}?")
correct_answer = alternatives[0]
labeled_alternatives = dict(
zip(ascii_lowercase, random.sample(alternatives, k=len(alternatives)))
)
for label, alternative in labeled_alternatives.items():
print(f" {label}) {alternative}")
while (answer_label := input("\nChoice? ")) not in labeled_alternatives:
print(f"Please answer one of {', '.join(labeled_alternatives)}")
answer = labeled_alternatives[answer_label]
if answer == correct_answer:
NUM_CORRECT += 1
print("⭐ Correct! ⭐")
else:
print(f"The answer is {correct_answer!r}, not {answer!r}")
print(f"\nYou got {NUM_CORRECT} correct out of {num} questions")
Conclusion
There are a number of tools used to improve your python code quality, Pylint is one of them. You can read more about improving your code quality here.
Top comments (0)