利用Stub File标注Python文件类型

简介: 在升级到Python 3.5+版本之后,最大的项目管理优化来自于PEP-484 Type Hint的引入。借助Type Hint,我们可以进一步提升Python代码的类型标注,保障在重构过程中避免出现一些低级失误。

在升级到Python 3.5+版本之后,最大的项目管理优化来自于PEP-484 Type Hint的引入。借助Type Hint,我们可以进一步提升Python代码的类型标注,保障在重构过程中避免出现一些低级失误。

我们可以通过高版本Python新加的新语法启用这项特性,然后通过mypy等工具检查:

def greeting(name: str) -> str:
    return 'Hello ' + name

然而,在实际实践过程中,也往往存在一些问题,这些问题来自于很多方面:

  • 你难免有一些历史性代码,这些代码需要同时支持Python2Python3
  • 你使用的Python 3 Only的第三方库没有Type Hint定义,作者看起来并不打算近期支持或者某些原因(比如你正在用的某个老版本不维护了)导致你不能贡献代码。

这些时候你往往是不能直接使用Type Hint带来的便利的,不过PEP-484中也考虑到了这种情况,包含了一种stub file的定义形式,可以通过第三方文件.pyi文件,定义函数参数类型与返回值类型。

比如官方文档中就定义了一个比较简单的stub例子。假设我们对一个名叫HttpRequest 的类进行类型标记:

# request.py


class HttpRequest:
    """A basic HTTP request."""

    def __init__(self):
        self.META = {"SERVER_NAME": "hello.com"}

    def get_raw_host(self):
        """
        Return the HTTP host using the environment or request headers. Skip
        allowed hosts protection, so may return an insecure host.
        """
        # Reconstruct the host using the algorithm from PEP 333.
        host = self.META["SERVER_NAME"]
        return host

接下来,我们可以在当前文件的文件夹下新建一个名叫bytes.pyi的文件,填写如下内容:

# request.py


class HttpRequest:
    def get_raw_host(self) -> str: ...

让我们先构建一个存在类型混淆的例子,如果你使用了mypy之类的工具进行检查,则可以快速发现下面例子中本来为int型的i被重新赋值了str类型。

checked

通过这样的方法,可以快速将已有的代码库快速添加类型。不过实际中并不是这么简单。我们之前也说过,很多项目并不是由我们自行维护的,这个时候,我们很难去修改上游仓库时,应该如何做呢?

这里,我们以mypy工具和Django这个Python常用为例去演示一下如何配置Django项目的类型检查。

这里有一个第三方提供的Django类型标注库django-stubs,我们可以通过pip命令进行安装:

pip install django-stubs

在安装完成之后,因为这个标注文件时单独发布的包,因此我们需要修改mypy的指向,让mypy使用这个包的标注。需要修改mypy.ini文件用于定义。关于这个文件的具体配置,则可以参考mypy工具的官方文档

[mypy]
plugins =
     mypy_django_plugin.main

接下来就可以使用mypy针对Django部分进行检查了。

目录
相关文章
|
1月前
|
数据采集 机器学习/深度学习 数据可视化
【办公自动化】使用Python批量处理Excel文件并转为csv文件
【办公自动化】使用Python批量处理Excel文件并转为csv文件
28 0
|
1月前
|
存储 自然语言处理 数据可视化
【办公自动化】用Python按时间分割txt文件中的数据
【办公自动化】用Python按时间分割txt文件中的数据
34 1
|
2天前
|
Python
在Python中,如何指定文件的读取和写入模式?
【2月更文挑战第10天】【2月更文挑战第27篇】在Python中,如何指定文件的读取和写入模式?
|
5天前
|
机器学习/深度学习 JSON 自然语言处理
python自动化标注工具+自定义目标P图替换+深度学习大模型(代码+教程+告别手动标注)
python自动化标注工具+自定义目标P图替换+深度学习大模型(代码+教程+告别手动标注)
21 0
|
11天前
|
存储 数据挖掘 数据处理
Python与Excel的交互:读写Excel文件和处理数据
Python与Excel的交互:读写Excel文件和处理数据
|
11天前
|
存储 数据处理 Python
文件I/O操作在Python中的实现与技巧
文件I/O操作在Python中的实现与技巧
|
11天前
|
Python
使用PyInstaller将Python应用程序打包成EXE文件
使用PyInstaller将Python应用程序打包成EXE文件
|
11天前
|
存储 Python
Python提取出多个NC文件中的时间信息数据
【2月更文挑战第2天】本文介绍基于Python语言,逐一读取大量.nc格式的多时相栅格文件,导出其中所具有的全部时间信息的方法~
Python提取出多个NC文件中的时间信息数据
|
12天前
|
存储 Python
用Python提取长时间序列遥感文件中缺失文件所对应的日期
【2月更文挑战第1天】本文介绍批量下载大量多时相的遥感影像文件后,基于Python语言与每一景遥感影像文件的文件名,对这些已下载的影像文件加以缺失情况的核对,并自动统计、列出未下载影像所对应的时相的方法~
用Python提取长时间序列遥感文件中缺失文件所对应的日期
|
27天前
|
数据采集 开发工具 Python
Python下载文件进度条Demo
Python下载文件进度条Demo
21 0

相关产品

  • 云迁移中心