Python PEP 8 代码风格指南

PythonBeginner
立即练习

介绍

在这个 Lab 中,你将学习如何将 PEP 8 风格指南应用于你的 Python 代码。PEP 8 是 Python 的官方风格指南,它提供了一套关于如何编写可读且一致的代码的建议。遵循这些指南能让你自己和他人都更容易阅读你的代码。

你将练习实现 PEP 8 的关键规则,包括缩进、行长度、间距和命名约定。你还将学习如何使用 autopep8 工具自动格式化你的代码,从而为你节省时间并确保符合社区标准。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 96%。获得了学习者 100% 的好评率。

理解 PEP 8 缩进和行长度

恰当的缩进和行长度是可读 Python 代码的基础。在这一步中,你将学习并应用 PEP 8 关于这两个方面的指南。

缩进: PEP 8 推荐每个缩进级别使用 4 个空格。这是 Python 社区中一个强烈的约定。

行长度: PEP 8 建议所有行的最大长度限制为 79 个字符。对于文档字符串(docstrings)和注释,限制为 72 个字符。这提高了可读性,尤其是在较小的屏幕上或并排比较代码时。

让我们将这些付诸实践。在左侧的文件浏览器中,找到并打开文件 indentation_example.py。其中的代码演示了函数定义和多行语句的正确缩进。

## 使用 4 个空格的正确缩进。
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

## 定义一些变量用于演示。
var_one = "first"
var_two = "second"
var_three = "third"
var_four = "fourth"

## 与开头的定界符对齐。
foo = long_function_name(var_one, var_two,
                         var_three, var_four)

## 使用悬挂缩进(hanging indent)。第一行没有参数,
## 后续行缩进以示区分。
bar = long_function_name(
    var_one, var_two,
    var_three, var_four)

## 一个多行列表。
my_list = [
    1, 2, 3,
    4, 5, 6,
]

## 调用函数以产生输出。
long_function_name("first call", "second", "third", "fourth")
foo = long_function_name("second call", "second", "third", "fourth")
bar = long_function_name("third call", "second", "third", "fourth")

查看完代码后,运行脚本以查看其输出。在 WebIDE 底部的终端中执行以下命令:

python ~/project/indentation_example.py

脚本将运行并打印每次函数调用的第一个参数。输出将是:

first call
second call
third call

这个练习展示了如何通过一致的缩进使复杂的函数调用和数据结构更易于阅读。

练习间距和命名约定

一致的间距和清晰的命名约定对于代码的可读性也至关重要。此步骤涵盖了 PEP 8 关于这两方面的规则。

间距:

  • 在大多数运算符(=+===<>)周围使用单个空格。
  • 在列表、元组和函数参数的逗号后使用空格。
  • 避免在括号、方括号或花括号内部紧挨着出现多余的空格。

命名约定:

  • snake_case:用于函数和变量(例如 my_functionuser_name)。
  • PascalCase:用于类名(例如 MyClass)。
  • UPPERCASE_SNAKE_CASE:用于常量(例如 MAX_CONNECTIONS)。

让我们看看这些规则是如何应用的。在文件浏览器中,打开 style_guide_example.py 文件。代码中包含了正确间距和命名的示例,并注释掉了不正确的版本以供比较。

## 一个常量
MAX_OVERFLOW = 100

## 一个 PascalCase 的类名
class MySampleClass:
    def __init__(self, name):
        ## 一个 snake_case 的变量名
        self.instance_name = name

    ## 一个 snake_case 的函数名
    def sample_method(self, var_one, var_two):
        ## 运算符周围和逗号后的正确间距
        result = var_one + var_two
        print(self.instance_name, result)

## --- 用于比较的错误示例 ---
## class mySampleClass:
##     def SampleMethod(self, varOne, varTwo):
##         result=varOne+varTwo
##         print(self.instance_name,result)

## 创建一个对象并调用方法
my_object = MySampleClass("TestObject")
my_object.sample_method(10, 5)

如果进行了任何更改,请保存文件,然后从终端运行它:

python ~/project/style_guide_example.py

输出将显示对象的名称和计算结果:

TestObject 15

通过遵循这些间距和命名规则,你使代码的结构和目的对任何阅读者来说都立即更加清晰。

使用 autopep8 进行自动格式化

手动格式化代码可能很乏味。幸运的是,存在可以自动化此过程的工具。在这一步中,你将安装并使用 autopep8,这是一个流行的工具,它可以自动重新格式化 Python 代码以符合 PEP 8 风格指南。

首先,你需要安装 autopep8 包。打开终端并运行以下命令。使用 sudo 是为了在系统范围内安装它。

sudo pip3 install autopep8

安装过程将开始,你应该会看到确认其成功安装的输出:

Collecting autopep8
...
Successfully installed autopep8-X.Y.Z

接下来,让我们处理一个故意格式很差的 Python 文件。在文件浏览器中,打开 unformatted_code.py 并检查其内容:

a=1
b=2;
def  my_function ( arg1 , arg2 = 0 ):
    result = arg1+arg2
    print( result)

此代码存在几个风格问题:间距不一致、多余的分号,以及函数定义中有多余的空格。

现在,让我们使用 autopep8 来修复它。--in-place 标志告诉工具直接修改文件。在终端中运行此命令:

autopep8 --in-place ~/project/unformatted_code.py

命令完成后,再次在编辑器中打开 unformatted_code.py。你将看到代码已自动清理:

a = 1
b = 2


def my_function(arg1, arg2=0):
    result = arg1 + arg2
    print(result)

注意 autopep8 如何更正了间距,删除了分号,并在函数定义前添加了两个空行,正如 PEP 8 所推荐的。使用像 autopep8 这样的自动格式化工具是跨项目维护一致代码风格的非常有效的方法。

整合所有知识点:重构脚本

现在是时候应用你所学到的一切了。在这一步中,你将手动重构一个违反了多项 PEP 8 指南的脚本。这个练习将检验你对缩进、间距和命名约定的理解。

首先,从文件浏览器中打开 refactor_challenge.py。它包含以下代码,该代码计算矩形的面积,但书写风格很差。

## This script calculates the area of a rectangle and prints it.
def CalculateArea(width,height):
    Area = width*height ## calculate area
    return Area

w = 10
h = 5
rectangle_area=CalculateArea(w,h)
print("The area of the rectangle is:",rectangle_area)

你的任务是手动编辑此代码,使其符合 PEP 8 规范。查找以下方面的问题:

  1. 函数命名: 函数名应使用 snake_case
  2. 变量命名: 变量名也应使用 snake_case
  3. 间距: 检查运算符周围和逗号后的间距是否正确。
  4. 注释: 行内注释的 # 后面应该有一个空格。

花点时间自己重构代码。完成后,你的代码应该看起来与此类似:

## This script calculates the area of a rectangle and prints it.
def calculate_area(width, height):
    """Calculate and return the area of a rectangle."""
    area = width * height  ## calculate area
    return area


w = 10
h = 5
rectangle_area = calculate_area(w, h)
print("The area of the rectangle is:", rectangle_area)

注意这些变化:CalculateArea 变成了 calculate_areaArea 变成了 area,并且间距得到了修正。我们还为函数添加了一个文档字符串(docstring),这是解释函数功能的最佳实践。

保存你的更改并运行脚本,以确保它仍然能正常工作:

python ~/project/refactor_challenge.py

输出应该是:

The area of the rectangle is: 50

这个练习表明,为风格而进行的重构不会改变代码的功能,但它极大地提高了代码的可读性和可维护性。

总结

在这个实验(Lab)中,你学习了 Python PEP 8 风格指南的基础知识。你练习了应用关于缩进、行长度、间距和命名约定的规则。你还发现了 autopep8 的强大功能,它可以自动格式化你的代码以满足这些标准。通过完成最后的重构挑战,你将所有这些概念整合在一起,将一个风格很差的脚本转换成了干净、可读且可维护的 Python 代码。遵守 PEP 8 是任何专业 Python 开发人员的关键实践,因为它有助于协作并提高代码质量。