我的编程空间,编程开发者的网络收藏夹
学习永远不晚

手把手教你用Python中的Linting提高代码质量

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

手把手教你用Python中的Linting提高代码质量

前言

Python 是一种不断发展的语言。随着它的演化和扩展,可用工具和开发策略的数量也在增加。近来流行的一个过程是linting —— 检查代码的潜在问题。通过linting,我们代码中的错误会被标记出来,这样我们就可以纠正可能导致出现问题的编程方法。

Linting(提示)是在编写源代码时和编译前进行的。换句话说,Linting是一种构建前的检查,也叫 “静态代码分析”。定期检查我们的代码,以确保整个代码和代码库的一致性。这最大限度地减少了小错误在代码运行后变成复杂问题的机会。

许多开发人员不使用Linting,因为他们没有看到它的附加价值,因为Linting不会防止错误。但这种观点低估了Linting在提高代码质量方面的价值。

在这篇实践文章中,我们将探讨在Python中使用Pylint——最流行的提示工具之一——进行快速的提示检查是多么快速和简单。我们还将看到,对代码进行提示是如何帮助我们遵守PEP8代码风格指南的。

前提条件

在开始之前,确保满足以下条件:

在你的机器上安装了Python和pip

对命令行界面(CLI)有基本的了解

对Python概念的理解,如函数和类。

另外,应该注意,虽然这里显示的命令与Linux和基于macOS的系统兼容,但在Windows下工作时,你应该小心。

Linting Python 代码

在我们深入研究如何在Python中使用linter之前,让我们通过创建一个目录和虚拟环境来进行设置。

建立环境

首先,为这个项目创建一个目录。在本教程中,我们把它叫做 pylint-demo

$ mkdir pylint-demo

$ cd pylint-demo

接下来,创建一个虚拟环境。这将隔离我们的项目依赖性,并防止与其他项目发生冲突。

$ pip install pipenv

$ pipenv shell

命令行应该是这样的。(pylint-demo)$。这表明虚拟环境已经激活。

在虚拟环境激活的情况下,使用下面的命令安装linter。

$ pipenv install pylint

现在我们可以用pylint命令运行linter。为了确保Pylint已经成功安装,运行以下命令。

$ pylint –help

开始使用 Linting

让我们写一个基本的Python程序,并在其上使用Pylint,看看它是如何工作的。创建一个 main.py文件并复制以下代码。

def is_number_even(num):
    return "Even" if num % 2 == 0 else "Odd"

num = 5
print(f"The number {num} is {is_number_even(num)}")

在上面的代码中,我们已经添加了一个函数来检查数字是偶数还是奇数。为了使用Pylint来检查这段代码中的错误,我们使用以下命令:

$ pylint <<file_name>>
$ pylint main.py

Pylint的输出情况如下:

************* Module main
main.py:12:0: C0304: Final newline missing (missing-final-newline)
main.py:1:0: C0114: Missing module docstring (missing-module-docstring)
main.py:8:0: C0116: Missing function or method docstring (missing-function-docstring)
main.py:8:19: W0621: Redefining name 'num' from outer scope (line 11) (redefined-outer-name)
main.py:11:0: C0103: Constant name "num" doesn't conform to UPPER_CASE naming style (invalid-name)

------------------------------------------------------------------
Your code has been rated at 0.00/10 (previous run: 0.00/10, +0.00)

我们可以在代码中看到几个不言而喻的问题,每个问题都用一个字符标识,如 C0304。Pylint将字母代码应用于所有错误,以区分问题的严重程度和性质。有五个不同类别的错误。

  • C: 惯例(针对任何违反代码惯例的行为)
  • R:重构(针对任何与代码气味和重构有关的问题)
  • W:警告(针对任何不属于错误的编程级问题)
  • E: 错误 (对于任何编程级别的问题,是一个错误)
  • F: Fatal (对于任何停止Pylint执行的严重问题)

Pylint还根据存在的错误数量给我们的代码打分,满分为10分。

在我们的例子中,除了一个错误代码外,所有的错误代码都是约定俗成的错误——单个错误是一个警告。为了解决这些问题,让我们在我们的代码中做一些修改,然后再次运行Pylint,看看我们的代码得到什么分数。

""" File contains various function to under Pylint """

def is_number_even(num):
    """Function to check if number is even or odd"""
    return "Even" if num % 2 == 0 else "Odd"

NUM = 5
print(f"The number {NUM} is {is_number_even(NUM)}")

通过这段代码,我们添加了一个模块和函数docstring,在结尾处添加了一个新行,并重新命名了上述代码中的变量。当我们重新运行Pylint时,我们得到了10/10的分数,没有任何问题。

在单个文件上运行Pylint

现在我们对Pylint的工作方式更加熟悉了,让我们看看另一个例子,输入以下代码:

""" File contains various function to under Pylint """

class animal:
  def __init__(self, name):
    self.name = name

obj1 = animal("Horse", 21)
print(obj1.name)

在这个片段中,我们有一个简单的类,名为 animal,该类的一个对象名为 obj1。现在让我们在这段代码上使用Pylint:

************* Module main
main.py:4:0: W0311: Bad indentation. Found 2 spaces, expected 4 (bad-indentation)
main.py:5:0: W0311: Bad indentation. Found 4 spaces, expected 8 (bad-indentation)
main.py:3:0: C0115: Missing class docstring (missing-class-docstring)
main.py:3:0: C0103: Class name "animal" doesn't conform to PascalCase naming style (invalid-name)
main.py:3:0: R0903: Too few public methods (0/2) (too-few-public-methods)
main.py:7:7: E1121: Too many positional arguments for constructor call (too-many-function-args)

请注意,虽然这次我们没有代码质量问题,但它们已经被更多实质性的错误所取代。有了这些问题的标记,让我们试着用下面的代码来修复它们:

""" File contains various function to under Pylint """

class Animal:
    "Animal Class"
    def __init__(self, name):
        self.name = name

obj1 = Animal("John")
print(obj1.name)

然后,重新运行Pylint。在将类的名称从 animal改为 Animal,为类添加一个文档字符串,删除函数调用中不需要的参数,并添加适当的缩进,我们几乎消除了代码中的错误。不过还剩下一个:

************* Module main
main.py:3:0: R0903: Too few public methods (0/2) (too-few-public-methods)

让我们看看如何解决这个剩余的错误。Pylint说我们没有两个或多个公共方法,但我们的代码很有可能没有两个或多个公共方法。那么,我们该如何解决这个问题呢?

在这样的情况下,我们可以使用Python注释来抑制这些问题。抑制它们的语法如下。

# pylint: disable=<<issue_name>>

下面是完整代码:

""" File contains various function to under Pylint """

# pylint: disable=too-few-public-methods
class Animal:
    "Animal Class"
    def __init__(self, name):
        self.name = name

obj1 = Animal("John")
print(obj1.name)

当我们现在检查Pylint的输出时,我们会看到这个问题已经消失了。

在一个目录上运行Pylint

我们已经看到了如何在单个文件上运行Pylint,但是当我们在一个项目上工作时,我们不会有单个文件可以检查。

要在整个目录上使用Pylint,请运行以下命令。

$ pylint 
<<
name_of_directory
>>

为了了解对一个目录的提示是如何工作的,让我们再创建两个文件并添加一些代码。

$ mkdir class="lazy" data-src; cd class="lazy" data-src
$ touch helpers.py config.py __init__.py

main.py文件移到 class="lazy" data-src目录,并将以下代码粘贴到相应的文件中。

<<main.py>>
""" File contains various function to under Pylint """

from helpers import connect_db
from config import DB_USER, DB_PASS

is_connected = connect_db(DB_USER, DB_PASS)

if is_connected:
    print("Connected to DB")
else:
    print("Failed to connect to DB")

<<helpers.py>>
def connect_db(user, password):
    """Dummy function to connect to DB"""
    if user is None or password is None:
        return False
    return True

<<config.py>>
DB_USER = "root"
DB_PASS = "toor"

我们在 class="lazy" data-src目录下有三个文件:main.pyhelpers.pyconfig.py。在 main.py中,我们有一个假函数来打印我们是否连接到了DB。helpers.py包含一个假的帮助函数来连接到DB, config.py文件包含DB的用户名和密码。

现在,让我们在根目录下使用以下命令在整个目录上运行Pylint。

$ pylint class="lazy" data-src

命令的输出将如下:

************* Module class="lazy" data-src.config
class="lazy" data-src/config.py:2:0: C0304: Final newline missing (missing-final-newline)
class="lazy" data-src/config.py:1:0: C0114: Missing module docstring (missing-module-docstring)
************* Module class="lazy" data-src.main
class="lazy" data-src/main.py:11:0: C0304: Final newline missing (missing-final-newline)
class="lazy" data-src/main.py:3:0: E0401: Unable to import 'helpers' (import-error)
class="lazy" data-src/main.py:4:0: E0401: Unable to import 'config' (import-error)
************* Module class="lazy" data-src.helpers
class="lazy" data-src/helpers.py:6:0: C0304: Final newline missing (missing-final-newline)
class="lazy" data-src/helpers.py:1:0: C0114: Missing module docstring (missing-module-docstring)

我们可以看到,Pylint向我们显示了不同文件的输出,用 ***和模块名称分开。为了解决这些问题,我们需要做以下修改。

  • 在每个文件的末尾添加一个新行。
  • 为每个文件和函数添加一个文档串。
  • import语句从 helpersimportconnect_db修改为 .helpersimportconnect_db

一旦我们解决了这些问题,我们会看到另一个问题——我们需要将 is_connected变量大写。我们可以改变变量名称,或者抑制警告来处理这个错误。

抑制警告

在对Python代码进行检查时,你很有可能需要定制或抑制多个警告。每次都添加注释是没有意义的。你可以创建一个 .rc文件来定制Pylint的行为,并直接从 .rc文件中抑制整个项目的警告,而不是一个一个地处理警告抑制实例。

你可以用下面的命令创建一个:

$ pylint 
--
generate
-
rcfile 
>
 pylint
.
rc

用Linting更好、更安全地编写代码

在Python中,在代码编写过程中对源代码进行检查,并在我们运行代码之前,沿途标记出错误。你也可以将Pylint嵌入到编辑器中,实时查看提示信息。

虽然提示并不能自动修复错误,但持续使用它有助于确保我们的代码质量保持高水准。因此,虽然有些开发者认为linting是浪费时间,但它在小问题滚雪球般发展成大问题之前就能极其有效地捕捉到。

在这篇文章中,我们已经探讨了如何通过linting和实施Pylint的建议来改善我们的示例代码。此外,这个过程本质上有助于我们遵守PEP8的风格指南。现在,你可以在你的项目中实施linting,你可以探索许多可用的linting工具,并确定哪种工具最能补充,并增强你的Python开发方法。

总结

到此这篇关于手把手教你用Python中Linting提高代码质量的文章就介绍到这了,更多相关Python Linting提高代码质量内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

手把手教你用Python中的Linting提高代码质量

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

手把手教你用Python中的Linting提高代码质量

Python是一种不断发展的语言,随着它的演化和扩展,可用工具和开发策略的数量也在增加,近来流行的一个过程是linting—检查代码的潜在问题,下面这篇文章主要给大家介绍了关于用Python中Linting提高代码质量的相关资料,需要的朋友可以参考下
2023-01-17

VUE 模板语法实战演练,手把手教你写出高质量代码

本文将带你领略Vue模板语法的魅力,通过实战演练,手把手教你写出高质量代码,让你成为一名Vue开发高手。
VUE 模板语法实战演练,手把手教你写出高质量代码
2024-02-10

手把手教你用322行Python代码编写贪吃蛇游戏

最近在学Python,想做点什么来练练手,命令行的贪吃蛇一般是C的练手项目,但是一时之间找不到别的,就先做个贪吃蛇来练练简单的语法,下面这篇文章主要给大家介绍了关于如何用322行Python代码编写贪吃蛇游戏的相关资料,需要的朋友可以参考下
2023-02-04

【代码实践】手把手教你编写高效的 VUE 计算属性

计算属性是 Vue.js 中一种高效的工具,用于计算和缓存派生数据值。本文将深入探讨计算属性,并提供分步指南,帮助您编写高效且可维护的计算属性。
【代码实践】手把手教你编写高效的 VUE 计算属性
2024-02-20

HTML 有序列表的代码示例:手把手教你实现实际应用

HTML有序列表的代码示例:轻松上手,实际应用
HTML 有序列表的代码示例:手把手教你实现实际应用
2024-03-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录