Friday, July 9, 2021

How to Write Beautiful Python Code With PEP 8

Naming Styles


Function

Use a lowercase word or words. Separate words by underscores to improve readability.

function, my_function

Variable

Use a lowercase single letter, word, or words. Separate words with underscores to improve readability.

x, var, my_variable

Class

Start each word with a capital letter. Do not separate words with underscores. This style is called camel case.

Model, MyClass

Method

Use a lowercase word or words. Separate words with underscores to improve readability.

class_method, method

Constant

Use an uppercase single letter, word, or words. Separate words with underscores to improve readability.

CONSTANT, MY_CONSTANT, MY_LONG_CONSTANT

Module

Use a short, lowercase word or words. Separate words with underscores to improve readability.

module.py, my_module.py



>>> # Not recommended

>>> x = 'John Smith'

>>> y, z = x.split()

>>> print(z, y, sep=', ')

'Smith, John'



>>> # Recommended

>>> name = 'John Smith'

>>> first_name, last_name = name.split()

>>> print(last_name, first_name, sep=', ')

'Smith, John'



# Not recommended

def db(x):

    return x * 2


# Recommended

def multiply_by_two(x):

    return x * 2


There is 79 character line limit recommended in PEP 8.


Surround top-level functions and classes with two blank lines. Top-level functions and classes should be fairly self-contained and handle separate functionality. It makes sense to put extra vertical space around them, so that it’s clear they are separate:


class MyFirstClass:

    pass



class MySecondClass:

    pass



def top_level_function():

    return None




Surround method definitions inside classes with a single blank line. Inside a class, functions are all related to one another. It’s good practice to leave only a single line between them:


Use blank lines sparingly inside functions to show clear steps. Sometimes, a complicated function has to complete several steps before the return statement. To help the reader understand the logic inside the function, it can be helpful to leave a blank line between each step.

In the example below, there is a function to calculate the variance of a list. This is two-step problem, so I have indicated each step by leaving a blank line between them. There is also a blank line before the return statement. This helps the reader clearly see what’s returned:



def calculate_variance(number_list):

    sum_list = 0

    for number in number_list:

        sum_list = sum_list + number

    mean = sum_list / len(number_list)


    sum_squares = 0

    for number in number_list:

        sum_squares = sum_squares + number**2

    mean_squares = sum_squares / len(number_list)


    return mean_squares - mean**2



Maximum Line Length and Line Breaking


PEP 8 suggests lines should be limited to 79 characters. This is because it allows you to have multiple files open next to one another, while also avoiding line wrapping.

Of course, keeping statements to 79 characters or less is not always possible. PEP 8 outlines ways to allow statements to run over several lines.

Python will assume line continuation if code is contained within parentheses, brackets, or braces:



PEP 8 suggests lines should be limited to 79 characters. This is because it allows you to have multiple files open next to one another, while also avoiding line wrapping.

Of course, keeping statements to 79 characters or less is not always possible. PEP 8 outlines ways to allow statements to run over several lines.

Python will assume line continuation if code is contained within parentheses, brackets, or braces:



def function(arg_one, arg_two,

             arg_three, arg_four):

    return arg_one



If it is impossible to use implied continuation, then you can use backslashes to break lines instead:


from mypkg import example1, \

    example2, example3


If line breaking needs to occur around binary operators, like + and *, it should occur before the operator. This rule stems from mathematics. Mathematicians agree that breaking before binary operators improves readability. Compare the following two examples.

Below is an example of breaking before a binary operator:



# Recommended

total = (first_variable

         + second_variable

         - third_variable)



# Not Recommended

total = (first_variable +

         second_variable -

         third_variable)



Indentation


Indentation, or leading whitespace, is extremely important in Python. The indentation level of lines of code in Python determines how statements are grouped together

x = 3

if x > 5:

    print('x is larger than 5')


The indented print statement lets Python know that it should only be executed if the if statement returns True. The same indentation applies to tell Python what code to execute when a function is called or what code belongs to a given class.

The key indentation rules laid out by PEP 8 are the following:

  • Use 4 consecutive spaces to indicate indentation.
  • Prefer spaces over tabs.



Tabs vs. Spaces


If you’re using Python 2 and have used a mixture of tabs and spaces to indent your code, you won’t see errors when trying to run it. To help you to check consistency, you can add a -t flag when running Python 2 code from the command line. The interpreter will issue warnings when you are inconsistent with your use of tabs and spaces:



python2 -t code.py

code.py: inconsistent use of tabs and spaces in indentation




python2 -tt code.py

  File "code.py", line 3

    print(i, j)

             ^

TabError: inconsistent use of tabs and spaces in indentation





References:

https://realpython.com/python-pep8/


No comments:

Post a Comment