Python 最佳实践
1. 提升代码质量的 Python 最佳实践
编写可读、条理清晰的代码会带来实实在在的改变,也能提升您的职业前景。虽然对初学者而言,编码似乎是机械而复杂的过程,但事实上,编码是一门艺术。
有许多技巧可以帮助您提升 Python 的代码质量。以下是其中一些尤为重要的建议。
缩进的“暴政”
缩进是指代码行开头的空格。在其他编程语言中,缩进只是提升可读性的手段;而在 Python 中,缩进是强制要求。Python 使用缩进来开启代码块。更具体地说,每一级缩进应为连续 4 个空格,如下例所示:
for number in [1,2,3,4]:
if number % 2 == 0:
print(number)
else:
continue
最大行长度
PEP 8 建议单行不应超过 79 个字符。这样做很有道理:短行更易阅读,而且这种长度还方便您在屏幕上并排打开多个文件。
空行
顶层函数和类定义前后使用两个空行。类中方法定义之间使用一个空行。可以(适度地)使用额外空行来分隔相关函数组。最后,在函数内部也可适度使用空行来表示逻辑分段。
使用 linter 和自动格式化工具
精通代码需要时间。在编码时关注所有细节既具挑战性也很耗时。幸运的是,机器,尤其是 linter 和格式化工具,能帮助我们保障代码质量。
Linter 会对源代码进行静态分析并检查语义不一致之处。格式化工具与其类似,会尝试重构代码的空格、行长、参数位置等,以确保不同文件或项目中的代码风格一致。Python 提供了种类繁多的 linter 和格式化工具供您选择。
牢记原则
尽管上述一些规则十分直接,编码往往也关乎品味与直觉。要成为“编码艺术家”,您应了解支撑 Python 的一些原则。其中一个典型例子是Python 之禅,我们在另一篇文章中进行了介绍。
2. Python 日志记录最佳实践
日志记录用于跟踪软件运行时发生的事件。尤其当应用程序规模和复杂度不断增长时,日志就成为开发、调试、运行与性能跟踪的关键技术。
自 Python 2.3 起,logging 模块便成为标准库的一部分,用于处理日志记录实践,并在 PEP 282 中有详尽描述。
日志记录在精神内核上与 print 函数相似。但 print 函数缺少许多对开发者有用的信息。日志记录则可以记录时间戳、出错的行号,还能将错误或其他信息输出到文件、套接字等。
要导入该模块,您只需运行以下代码:
import logging
并非所有日志消息都相同。事实上,该模块根据消息的严重程度提供了不同的日志级别,具体如下:
- NOTSET (0):表示记录所有消息。
- Debug (10):用于诊断代码中的问题。
- Info (20):可用于确认代码未出现错误。一个典型用例是跟踪机器学习模型训练的进度。
- Warning (30):指示未来可能出现的问题。例如,对即将废弃的模块或内存不足的情况发出警告。
- Error (40):表示代码中的严重错误;可能是语法错误、内存不足或抛出异常。
- Critical (50):导致程序可能无法继续运行或异常退出的错误。
import logging
logging.info('This message is just informative')
logging.debug('My missions is to provide information about debugging.')
logging.critical("A Critical Logging Message")
话虽如此,以下是处理 Python 日志的六条最佳实践。
用日志替代打印
前面提到,日志与 print 函数一样可以提供信息。然而日志功能更强大,能够提供更细粒度的信息。
当您还不熟悉日志流程时,可能会倾向于使用 print 函数,但日志始终是更安全的选择。它们更适合扩展,并能应对复杂应用。
网上资料十分丰富。例如,这篇 DataCamp 的日志教程或许正适合您入门。
使用 logging 模块
该模块是大多数 Python 开发者的首选。这意味着它维护良好,并有庞大的社区支持,能够为您的疑问提供答案。
明智选择日志级别
logging 模块提供六种不同级别的消息,每种都针对特定目的设计。越是遵循这些级别,您和用户就越容易理解代码中发生了什么。
记录时间戳
这是日志区别于 print 函数的关键特性。除了知道问题出现在哪里,弄清它何时发生也很重要。时间戳是您在这类场景中的得力助手。请确保使用标准格式书写时间戳,即 ISO-8601 格式。
清理日志“垃圾桶”
使用 RotatingFileHandler 类(如 TimedRotatingFileHandler)替代 FileHandler,以归档、压缩或删除旧日志文件,避免占用过多存储空间。这些类会在达到大小限制或触发时间条件时自动清理空间。
3. Python 注释最佳实践
注释对于为代码的后续阅读者做标注至关重要。尽管很难精确定义代码应如何注释,但我们可以遵循一些准则:
- 与代码相矛盾的注释比没有注释更糟。因此,务必同时更新代码与注释,避免产生不一致。
- 注释应为完整句子,且首字母大写。
- 尽量用英语编写注释。尽管每个人都可以使用自己认为合适的语言,但推荐使用英语。
- 确保您的注释清晰易懂,便于使用该语言的其他人理解。
注释分为两类:块注释和行内注释。
块注释用于解释其后面的代码。通常,块注释与其对应的代码块保持相同缩进级别。块注释的每一行以 # 加一个空格开头,如下所示:
# This is a block comment
print('Welcome to DataCamp!")
另一方面,行内注释与代码处于同一行。行内注释应与语句之间至少用两个空格分隔。与块注释类似,行内注释以一个井号(#)开头,后跟一个空格和文本字符串。
print ("Have you ever tried Python?") # This is an inline comment
4. Python 文档字符串(docstring)最佳实践
文档字符串是出现在模块、函数、类或方法定义中第一条语句的字符串字面量。通常,您使用文档字符串来自动生成代码文档。因此,docstring 可在运行时通过对象的特殊属性 obj.__doc__ 访问。
为保持一致性,文档字符串始终使用三重双引号(""")包裹。
docstring 有两种形式:单行和多行。单行 docstring 适用于非常显而易见的情况,且应真正控制在一行内。以下示例展示了 multiply() 函数中的单行 docstring:
def multiply(x, y):
""" Return the product of two numbers """
result = x * y
return result
而多行 docstring 可跨越多行。此类 docstring 应记录脚本的功能、命令行语法、环境变量和文件。用法说明可以相对详细,应足以让新用户正确使用该命令。
def calculate_salary(hours, price=20):
""" Return the salary according to the hours worked
Arguments:
hours: total hours investe
price: price of each hours worked. Minimum price is 20 dollars
"""
salary = hours * price
return salary
有关 docstring 的更详细说明,请参阅 PEP257。
5. Python 文档编写最佳实践
注释有助于与您合作的其他开发者理解代码,而文档的目标是帮助潜在用户群体学会使用您的软件。这一步至关重要:无论您的软件多么优秀,如果文档不够完善,甚至缺失,人们都不会使用它。
包含一个 README 文件始终是好做法,尤其在您启动新项目时。该文件通常是读者了解您代码的主要入口点,包含面向用户和维护者的一般信息。
尽管需要简明扼要,README 文件应说明项目的目的、软件主源码的 URL 以及致谢信息。
同样,您应始终包含 setup.py 文件,以确保该软件或库使用 Distutils(分发 Python 模块的标准)进行打包和分发。
此外,如果您的软件运行需要其他依赖或包,您应包含一个 requirements.txt 文件,描述所需依赖及其版本。
最后,您可以自由添加任何您认为对潜在用户有用的信息。例如,提供如何使用您的包或函数的示例就是一种很好的实践。
6. Python 虚拟环境最佳实践
为确保数据项目之间的有序与一致,建议为您启动的每个项目都创建一个虚拟环境。
虚拟环境(virtualenv)有助于将 Python 及项目所需库的版本与相关的 pip 版本进行解耦与隔离。这样一来,终端用户可以独立于系统环境,安装并管理他们所需的软件及版本。
要创建虚拟环境,首先需要安装相应的包,请在终端中输入以下命令:
pip install virtualenv
要创建一个新的虚拟环境,使用以下命令即可。我们将新虚拟环境命名为“new_venv”:
python3 -m venv /path/to/new/virtual/environment/new_venv
Python 命名约定
初学者 Python 开发者最常见的错误之一就是不恰当的命名(变量、类、函数等)。命名约定是确保代码可读性的关键因素。
PEP 8 解释了 Python 中对象的标准命名方式。根据指南,新模块与包(包括第三方框架)应遵循这些标准,但如果现有库采用了不同风格,则更应优先保持内部一致性。
避免使用过于笼统或过于“接地气”的名称。此外,标准库中使用的标识符必须与 ASCII 兼容,如 PEP 3131 所述。
# Bad naming:
data_structure, ríos_españa, dictionary_with_countries_and_capitals
# Good naming:
user_profile, stop_words, global_emissions_df
以下列出了 Python 中最常见对象的命名约定。
- 包与模块
- 包和模块名应全部小写
- 仅当有助于提升可读性时,才可在包和模块名中使用下划线。
- 类
- 类名应遵循大驼峰(UpperCaseCamelCase)约定
- 然而,Python 内置类通常使用小写单词
- 实例变量、方法与函数
- 实例变量名应全部小写
- 使用下划线连接实例变量名中的多个单词
- 非公有实例变量应以下划线开头
- 常量
- 常量名必须全部大写
- 使用下划线连接常量名中的多个单词
|
标识符 |
约定 |
|
模块 |
小写 |
|
类 |
大写开头的驼峰(CapWords) |
|
函数 |
小写 |
|
方法 |
小写 |
|
类型变量 |
大写开头的驼峰(CapWords) |
|
常量 |
全大写(UPPERCASE) |
|
包 |
小写 |
结语
掌握 Python 的最佳实践对于编写干净、高效、可维护的代码至关重要。遵循有关代码质量、日志记录、注释与文档的指南,并使用虚拟环境等工具,能让您的项目更易于管理、协作与扩展。
在持续提升 Python 技能的过程中,建议进一步探索更深入的学习资源,以加深对 Python 及其广泛应用的理解。如果您在寻找系统化的指导,不妨看看这些资源:
- 如何学习 Python:专家指南——这份专家指南将帮助您规划学习路径,提供掌握 Python 的技巧与方法。
- 面向开发者的 Python 入门——非常适合希望开始学习 Python 的开发者,本课程以实践为导向,涵盖语言的核心概念与特性。
- Python 数据科学入门——当您对 Python 足够熟悉后,可通过这门适合初学者的课程深入学习数据科学。课程涵盖在 Python 中处理数据所需的关键库与技术。
Python 最佳实践常见问答
为什么要遵循编码最佳实践?
在软件开发过程中,确保代码可读、质量可靠且具备可扩展性。
什么是虚拟环境?
虚拟环境是一种工具,通过为每个项目创建独立隔离的环境来分离不同项目的依赖。
什么是 PEP 8?
这是一份提供如何编写 Python 代码的标准指南与最佳实践的文档。
什么是缩进?
缩进是指代码行开头的空格。Python 使用缩进来表示代码块。
什么是 Python 之禅?
Python 之禅是一组包含 19 条的“指导性原则”,用于编写计算机程序,并影响了 Python 语言的设计。
什么是文档字符串(docstring)?
Python 文档字符串(docstring)是用于记录 Python 模块、类、函数或方法的字符串,帮助程序员无需阅读具体实现细节也能理解其作用。
Python 中常见的注释有几种类型?
常见的注释类型有两种:块注释和行内注释。

我是一名自由职业的数据分析师,与全球各地的公司和组织合作开展数据科学项目。我也担任数据科学讲师,拥有2年以上授课经验。我经常用英语和西班牙语撰写与数据科学相关的文章,其中一些已发表在 DataCamp、Towards Data Science 和 Analytics Vidhya 等知名网站上。作为一名具有政治学与法律背景的数据科学家,我的目标是在公共政策、法律与技术的交汇处开展工作,借助思想的力量推动创新解决方案与叙事,帮助我们应对紧迫挑战,尤其是气候危机。我认为自己是自学成才、不断进步的人,坚定支持跨学科合作。学习新事物永远不嫌晚。
编码是一种艺术,即为计算机编写执行特定任务的指令(也称为算法)。为了与计算机交流,开发者使用编程语言。
与英语、俄语或克丘亚语等自然语言相似,编程语言也包含一套特定的语法和语义规则,为交流提供基础。尽管自然语言更复杂、灵活且动态,但这些特性在一定程度上也适用于编程语言。
即便是最简单的算法,也可以用多种不同方式来书写。虽然在开发代码时保留一定的灵活性是可取的,但当多人协作时,这种灵活性可能会影响效率和沟通效果。
因此,可读性是代码编写的关键环节。为确保开发者保持一致,大多数编程语言都制定了编码规范。这些文档为编写可读、可维护、可扩展的代码提供了指南与最佳实践。
本文将介绍在 Python(最受欢迎的数据科学语言之一)中进行编码的最佳实践。以下内容主要 基于 PEP 8,这是一份 Python 代码编写的标准指南。
想了解 Python 的用途,请查看我们的文章或《Python 入门》课程。
什么是 PEP 8?
“代码被阅读的次数远多于被编写的次数。代码应始终以促进可读性的方式来编写。”——Python 发明者 Guido van Rossum
PEP 8 是 Python 代码的风格指南。它由 Guido van Rossum、Barry Warsaw 和 Nick Coghlan 于 2001 年撰写,提供了一系列建议,帮助编写更具可读性和一致性的代码。内容涵盖从如何为变量命名到单行的最大字符数等方方面面。
PEP 是 Python Enhancement Proposal(Python 增强提案)的缩写。PEP 是描述 Python 新特性及其设计与风格等方面的文档。
虽然并非强制要求,但许多 Python 社区成员都遵循 PEP 8。因此,强烈建议您遵循这些指南。这样做也能提升您作为专业程序员的资历。
尽管 PEP 8 得到广泛认可,但其指南未必适用于所有特定场景。在这些情况下,公司通常会制定自己的约定。