利用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部分进行检查了。

目录
相关文章
|
14天前
|
存储 算法 Serverless
剖析文件共享工具背后的Python哈希表算法奥秘
在数字化时代,文件共享工具不可或缺。哈希表算法通过将文件名或哈希值映射到存储位置,实现快速检索与高效管理。Python中的哈希表可用于创建简易文件索引,支持快速插入和查找文件路径。哈希表不仅提升了文件定位速度,还优化了存储管理和多节点数据一致性,确保文件共享工具高效运行,满足多用户并发需求,推动文件共享领域向更高效、便捷的方向发展。
|
1月前
|
计算机视觉 Python
如何使用Python将TS文件转换为MP4
本文介绍了如何使用Python和FFmpeg将TS文件转换为MP4文件。首先需要安装Python和FFmpeg,然后通过`subprocess`模块调用FFmpeg命令,实现文件格式的转换。代码示例展示了具体的操作步骤,包括检查文件存在性、构建FFmpeg命令和执行转换过程。
52 7
|
3月前
|
自然语言处理 数据处理 Python
python操作和解析ppt文件 | python小知识
本文将带你从零开始,了解PPT解析的工具、工作原理以及常用的基本操作,并提供具体的代码示例和必要的说明【10月更文挑战第4天】
608 60
|
3月前
|
安全 Linux 数据安全/隐私保护
python知识点100篇系列(15)-加密python源代码为pyd文件
【10月更文挑战第5天】为了保护Python源码不被查看,可将其编译成二进制文件(Windows下为.pyd,Linux下为.so)。以Python3.8为例,通过Cython工具,先写好Python代码并加入`# cython: language_level=3`指令,安装easycython库后,使用`easycython *.py`命令编译源文件,最终生成.pyd文件供直接导入使用。
120 3
python知识点100篇系列(15)-加密python源代码为pyd文件
|
2月前
|
开发者 Python
Python中__init__.py文件的作用
`__init__.py`文件在Python包管理中扮演着重要角色,通过标识目录为包、初始化包、控制导入行为、支持递归包结构以及定义包的命名空间,`__init__.py`文件为组织和管理Python代码提供了强大支持。理解并正确使用 `__init__.py`文件,可以帮助开发者更好地组织代码,提高代码的可维护性和可读性。
147 2
|
3月前
|
Linux 区块链 Python
Python实用记录(十三):python脚本打包exe文件并运行
这篇文章介绍了如何使用PyInstaller将Python脚本打包成可执行文件(exe),并提供了详细的步骤和注意事项。
147 1
Python实用记录(十三):python脚本打包exe文件并运行
|
2月前
|
中间件 Docker Python
【Azure Function】FTP上传了Python Function文件后,无法在门户页面加载函数的问题
通过FTP上传Python Function至Azure云后,出现函数列表无法加载的问题。经排查,发现是由于`requirements.txt`中的依赖包未被正确安装。解决方法为:在本地安装依赖包到`.python_packages/lib/site-packages`目录,再将该目录内容上传至云上的`wwwroot`目录,并重启应用。最终成功加载函数列表。
|
3月前
|
Java Python
> python知识点100篇系列(19)-使用python下载文件的几种方式
【10月更文挑战第7天】本文介绍了使用Python下载文件的五种方法,包括使用requests、wget、线程池、urllib3和asyncio模块。每种方法适用于不同的场景,如单文件下载、多文件并发下载等,提供了丰富的选择。
|
3月前
|
数据安全/隐私保护 流计算 开发者
python知识点100篇系列(18)-解析m3u8文件的下载视频
【10月更文挑战第6天】m3u8是苹果公司推出的一种视频播放标准,采用UTF-8编码,主要用于记录视频的网络地址。HLS(Http Live Streaming)是苹果公司提出的一种基于HTTP的流媒体传输协议,通过m3u8索引文件按序访问ts文件,实现音视频播放。本文介绍了如何通过浏览器找到m3u8文件,解析m3u8文件获取ts文件地址,下载ts文件并解密(如有必要),最后使用ffmpeg合并ts文件为mp4文件。
|
3月前
|
JSON 数据格式 Python
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
这篇文章介绍了一个Python脚本,用于统计TXT或JSON文件中特定单词的出现次数。它包含两个函数,分别处理文本和JSON文件,并通过命令行参数接收文件路径、目标单词和文件格式。文章还提供了代码逻辑的解释和示例用法。
61 0
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数