在团队中工作时,重要的是建立一组最佳实践,以使所有新老开发人员都能提高工作效率,同时减少错误数量和理解代码块所需的时间。

如果您正在与其他开发人员一起工作并且需要明确使用函数签名和变量,那么使用静态类型语言可能是您项目的不错选择。从 Python 3 开始,您可以添加静态类型,但如果您将不正确的值分配给变量,IDE 或代码编辑器不会显示任何错误。

在本教程中,我们将设置 Python 使其表现得像静态类型语言。我们将在 VS Code 中为 Python 项目配置实时静态类型检查。我更喜欢设置仅在您在代码中显式添加变量类型或函数参数时显示错误,同时仍允许正常变量。

配置Venv

Venv 是一个 Python 内置工具,用于创建隔离项目依赖项的虚拟环境,因此您可以仅为该特定项目安装依赖项,而不会影响计算机中的其他项目。

Windows 设置

py -m venv venv

.\venv\Scripts\activate

进入全屏模式 退出全屏模式

Linux 或 MacOS 设置

python3 -m venv venv

venv/bin/activate

进入全屏模式 退出全屏模式

安装Mypy

接下来,安装Mypy。这个包检查你的 Python 代码中的类型,并根据你的需要定义一组规则。

设置

pip install mypy

进入全屏模式 退出全屏模式

添加Gitlens扩展

为 VS Code 安装GitLens扩展。

接下来,在本地settings.json中添加这些设置。

{
  "python.linting.mypyEnabled": true,
  "python.linting.mypyArgs": [
    "--ignore-missing-imports",
    "--follow-imports=silent",
    "--show-column-numbers",
    "--allow-untyped-defs",
    "--allow-subclassing-any",
    "--allow-untyped-calls",
    "--strict"
  ]
}

进入全屏模式 退出全屏模式

--strict:此选项启用严格的类型检查。虽然,在某些情况下它可能过于严格。当您拥有现有代码并且您不想更改它,因为您知道它可以工作。此外,如此多的错误可能会分散开发人员的注意力。下面的标志自定义此严格模式以使其不那么严格。

--ignore-missing-imports:抑制有关未解析导入的错误消息。在 Django 中,一些导入可能会在没有此标志的情况下引发警告。仅当您的项目包含您知道不是真正问题的警告时才使用它。

--follow-imports=silent:关闭导入模块中的类型检查。许多库在开发时并没有考虑到静态类型检查,因此最好在导入的模块中抑制类型检查。

--show-column-numbers:在错误消息中显示列号。

--allow-untyped-defs:如果 Python 中有非类型函数,则抑制错误。

--allow-subclassing-any:允许对 Any 类型的值进行子类化。一些框架可以用 Mypy 抛出这些错误,因此如果你有它们,添加这一行。

--allow-untyped-calls:允许您在代码中调用非类型化函数。

通过使用此设置将其逐渐添加到您的项目中,您应该不会有任何问题。 Mypy 有很多选项,请随时根据您的具体情况尝试其他配置。

第一个简单的例子

在项目的根目录中创建一个example.py

将此代码(我将其保留在这里)添加到该文件中。

def sum(n1: int, n2: int) -> int:
    return n1 + n2


def sub(n1, n2):
    return n1-n2


result = sum(1, 2.5)
print(result)
result = sub(1, 2.5)
print(result)

进入全屏模式 退出全屏模式

正如您在下图中看到的,显示了很多错误,因为sum需要两个 int 参数,但给定了一个浮点值。但是,sub缺少类型定义,不会显示错误。

简单示例

这真的很强大。错误仅显示在所需的函数和变量中,并且不会干扰您现有的代码库。

Django 示例

让我们使用 Django 项目尝试更复杂的场景。 Django 是一个构建 Web 应用程序的框架。请参阅此处的文档。不过不用担心,没有必要知道它来遵循本节。

请记住,Django 不是静态类型的框架。在settings.json中只使用--strict模式会导致很多错误。如果您如前所述配置了settings.json文件,则应该没有任何问题。

要创建一个新项目:

    pip install django
    django-admin startproject myapp
    cd myapp
    py manage.py startapp clients

进入全屏模式 退出全屏模式

现在让我们添加一些在client.views.py中生成错误的代码

from django.http import JsonResponse
from django.shortcuts import render
from urllib.request import Request
from venv import create


def createGreeting(name: str) -> str:
    return f'Hello {name}!!!!'


def getPower(n):
    x = 42 == 'no'
    return n**2


def index(request):
    message = createGreeting(3, 'asdf')
    message = createGreeting(100)
    message: int = 'asdf'
    message: str = 1234
    n = getPower('asdf')
    return JsonResponse({'message': message})

进入全屏模式 退出全屏模式

尽管clients.urls.py出现了许多错误,但该项目仍在运行。 Django 导入和默认代码都很好,因为它只会检查您手动输入的变量和函数。

Django 示例

结论

在本教程中,我们学习了如何配置 Visual Studio Code 以检查 Python 项目中的静态类型并显示开发中的错误。

请记住,您可以根据需要严格,但要小心。以下是需要牢记的注意事项列表:

优点:

  • 如果在一个团队中工作,它会减少理解如何使用一段代码的认知努力。

  • 提高生产力,因为代码记录了自己。

  • 改进了代码文档和可读性。

  • 减少冗余测试

  • 恒定的实时反馈。

  • 减少开发错误

  • 它是可定制的。

缺点:

  • 增加项目的复杂性。

  • 许多 Python 开发人员不喜欢键入代码。

  • 无法确定函数会返回它所说的内容。

  • 您的配置限制越少,显示的错误就越少。

使用它来开发必须经过彻底测试的新库和复杂模块。不建议尝试将静态类型添加到第三方库或遗留代码库(除非绝对必要),因为这可能会导致很多问题和花费时间。专注于要编写的新代码。随意尝试不同的配置。从长远来看,您和您的团队将感谢将此工具纳入工作流程。

参考书目

Tushar Sadhwani - 2021 -mypy 综合指南

Kracekumar - 2021 -类型检查您的 Django 应用程序

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐