首页 > 编程问答 >类型提示和 ctypes 外部函数

类型提示和 ctypes 外部函数

时间:2024-07-24 14:19:22浏览次数:11  
标签:python ctypes python-typing mypy

我应该如何类型提示用 Python 的 ctypes 定义的外部函数?

我需要重复 restype argtypes 属性中提供的信息吗? 或者是否有一种方法可以使 mypy 以某种方式理解属性?

例如,给定此函数定义:

    # Original function definition:

    libopus.opus_encode.restype = opus_int32
    libopus.opus_encode.argtypes = [oe_p, opus_int16_p, c_int, c_uchar_p, opus_int32]

    def opus_encode(st, pcm, frame_size, data, max_data_bytes):
        return libopus.opus_encode(st, pcm, frame_size, data, max_data_bytes)

是手动复制类型信息的最佳方法吗?

    # Duplicated type specification:

    libopus.opus_encode.restype = opus_int32
    libopus.opus_encode.argtypes = [oe_p, opus_int16_p, c_int, c_uchar_p, opus_int32]

    def opus_encode(st: oe_p, 
                    pcm: opus_int16_p, 
                    frame_size: c_int, 
                    data: c_uchar_p, 
                    max_data_bytes: opus_int32) -> opus_int32:
        return libopus.opus_encode(st, pcm, frame_size, data, max_data_bytes)

或者有更好的方法吗?


遗憾的是,无法使 mypy 自动推断出 ctypes 函数的类型信息。因此, 你需要手动复制类型信息 ,就像你在第二个例子中做的那样。

虽然重复的信息看起来有些冗余,但这却是目前最有效的方式:

  1. 清晰明了 : 显式地声明参数和返回值类型使函数签名更容易理解,特别是在处理 ctypes 特有的类型时,例如 c_int c_uchar_p

  2. mypy 支持 : mypy 能够理解函数签名中的类型提示,并据此进行类型检查,确保代码的类型安全。

  3. 文档 : 类型提示也作为函数的文档,使其他人更容易理解如何使用该函数。

为了使代码更简洁,可以考虑使用类型别名:

from ctypes import c_int, c_uchar_p

# 类型别名
OpusEncoder = c_int
OpusInt16Ptr = c_int16_p
OpusUcharPtr = c_uchar_p

libopus.opus_encode.restype = OpusEncoder
libopus.opus_encode.argtypes = [oe_p, OpusInt16Ptr, c_int, OpusUcharPtr, OpusEncoder]

def opus_encode(st: oe_p, 
                pcm: OpusInt16Ptr, 
                frame_size: c_int, 
                data: OpusUcharPtr, 
                max_data_bytes: OpusEncoder) -> OpusEncoder:
    return libopus.opus_encode(st, pcm, frame_size, data, max_data_bytes)

这样可以提高代码的可读性,并减少重复。

总而言之,虽然目前无法避免重复信息,但通过使用类型提示和类型别名,你可以使代码更加清晰易懂,并确保类型安全。

标签:python,ctypes,python-typing,mypy
From: 64193271

相关文章

  • 在类型提示中使用 Type[class_name] 而不是仅使用 class_name 时,python 未解析的属性
    我想输入提示继承结构,但我不知道如何正确执行。这个想法是函数c可以采用A的任何子类。一些子类具有其他子类没有的属性,并且这些属性不是在父类中定义,而是在子类中定义。函数c检查子类,如果它是正确的,则使用该类的特定属性。在此设置中,PyCharm抱怨该参数不在父类中。from......
  • python的包管理
    获取现有项目有那些依赖安装pipreqspipinstallpipreqs在项目根目录执行pipreqs.--encoding=utf8--force--pypi-server=http://mirrors.aliyun.com/pypi/simple/根据生成文件安装依赖pipinstall-rrequriements.txtpipreqs命令选项Options:--use-local......
  • 如何在 python selenium 中禁用广告隐私设置?
    我对上面有一些问题。当然,当我尝试绕过cloudflare验证码时,我的策略已经破坏了任何cloudflare。但有一些问题。当我在pythonselenium中打开新选项卡时,会弹出广告隐私窗口。谁有解决这个问题的经验。谢谢您的帮助。一旦通过,就不会再发生了。我理解你想在......
  • [附开题]flask框架的基于微信小程序的医院远程预约挂号系统设计与实现6ky98(python+源
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着医疗需求的日益增长和互联网技术的飞速发展,传统的医院挂号方式已难以满足患者高效、便捷的就医需求。患者往往需要长时间排队等待挂号......
  • [附开题]flask框架的基于用户行为分析的商品推荐系统APP1qut6APP(python+源码)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在移动互联网时代,电子商务平台的竞争日益激烈,如何精准地推荐商品给用户,提升用户体验与购买转化率,成为电商企业关注的焦点。传统的推荐算法......
  • [附开题]flask框架的教务管理系统q6190(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和教育改革的不断深入,教务管理工作日益复杂且重要。传统的手工管理方式已难以满足当前高校教务管理的需求,特别是在......
  • python闭包和装饰器
    一、闭包1.闭包的三要素1.外部函数嵌套内部函数2.内部函数可以调用外部函数的局部变量3.外部函数返回内部函数2.示例代码 #外部函数deffunc1():print("func1")#内部函数deffunc2():print("func2")#外部函数返回内部函数re......
  • python Subprocess 模块
    Subprocess介绍subprocess模块是Python标准库中的一个模块,用于管理子进程(子程序)。通过subprocess模块,可以在Python脚本中启动新的进程、连接到它们的输入/输出流以及获取它们的返回值。Subprocess主要功能1.执行外部命令:subprocess允许你在Python脚本中执行系统命......
  • Python 类型提示:自引用类型检查
    我认为静态类型确实会让我在Python中的生活更轻松,考虑到我通常使用C语言工作。我创建了一个像这样的类:classnode(object):"""properties,constructor,etc."""defadd_outneighbor(self,neighbor:node)->None:"""d......
  • Python用shp文件裁剪多个遥感影像的方法
      本文介绍基于Python中ArcPy模块,基于矢量数据范围,对大量栅格遥感影像加以批量裁剪掩膜的方法。  首先,话不多说,本文所需要的代码如下所示。#-*-coding:utf-8-*-"""CreatedonTueDec1320:07:482022@author:fkxxgis"""importarcpyfromarcpy.saimport*......