首页 > 编程问答 >如何在Python中提示self变量的类型

如何在Python中提示self变量的类型

时间:2024-07-24 16:26:05浏览次数:12  
标签:python python-typing

通常不需要关心Python类成员函数中的 self 变量,但我正在实现一个装饰器,看起来像

def extractor(depends: List[Text]=None,
              provides: List[Text]=None) -> Callable[[ExtractorFunction],
                                                     ExtractorFunction]:
    def _func_wrapper(func: ExtractorFunction) -> ExtractorFunction:
        func.is_extractor = True    # The value is not important through
        func.depends = depends
        func.provides = provides

        @functools.wraps(func)
        def _wrapper(self, parsed: CCDATA, target: ExtractResult) -> None:
            func(self, parsed, target)
        return _wrapper
    return _func_wrapper

,其目的是这样使用:

class Extractor():
    @extractor()
    def _extractor_for_xxx(self, parsed: CCDATA, target: ExtractResult) -> None:
        pass

ExtractResult 定义良好,但我不确定如何定义 ExtractorFunction 类型。有任何想法吗?


你可以使用 typing.Protocol 来定义 ExtractorFunction 类型。 Protocol 允许你定义一个结构化的类型,而不需要明确地继承它。这在定义回调函数、装饰器和鸭子类型时特别有用。

from typing import Protocol, List, TypeVar, Callable
from typing_extensions import Self  # For Python < 3.11

CCDATA = TypeVar('CCDATA')
ExtractResult = TypeVar('ExtractResult')

class ExtractorFunction(Protocol):
    is_extractor: bool
    depends: List[str]
    provides: List[str]
    __call__: Callable[..., None]  # 使用省略号(...)表示任意数量的参数

    def __call__(self, self: Self, parsed: CCDATA, target: ExtractResult) -> None:
        ...

def extractor(depends: List[str] = None, 
              provides: List[str] = None) -> Callable[[ExtractorFunction], ExtractorFunction]:
    def _func_wrapper(func: ExtractorFunction) -> ExtractorFunction:
        func.is_extractor = True
        func.depends = depends or []
        func.provides = provides or []

        @functools.wraps(func)
        def _wrapper(self, parsed: CCDATA, target: ExtractResult) -> None:
            func(self, parsed, target)
        return _wrapper  # type: ignore
    return _func_wrapper

在这个例子中, ExtractorFunction 被定义为一个 Protocol ,它指定了四个属性: is_extractor depends provides __call__ __call__ 使用 typing.Callable 来表示它是一个可调用对象,并且使用省略号 ( ... ) 来表示它可以接受任意数量和类型的参数。

需要注意的是:

  • 我们使用 typing_extensions.Self 来表示 __call__ 方法中的 self 类型。在 Python 3.11 及以后版本中,你可以直接使用 typing.Self
  • 我们在 return _wrapper 后面添加了 # type: ignore ,因为 MyPy 目前还不能完全理解 Protocol 和装饰器的组合。

使用这个定义,MyPy 就可以检查你的代码,并确保你正确地使用了 extractor 装饰器和 ExtractorFunction 类型。

标签:python,python-typing
From: 53918427

相关文章

  • 将 Python 类型提示限制为元组中的值
    我的方法之一采用status中使用的filter()参数。此参数与定义如下的模型字段相关:STATUS_CHOICES=((1,_("draft")),(2,_("private")),(3,_("published")),)classMyModel(Model):status=models.PositiveSmallIntegerFi......
  • 在python中查找区间数据的中位数
    我正在探索不同的python库,我想知道如何找到分组数据集的近似中值。这里有一个表格供参考。年龄频率1-1012310-203502......
  • 比较Python中的字符串统一特殊字符
    也许我可以使用更好的英语,但我想要的是忽略单词中的重音(和类似的),所以:renè、rené、rene'和rene应该是相同的,所以应该mañana和manana或even-distribuited和evendistribuited,可能还有sho......
  • 如何使用 Python 脚本从客户账单电子邮件中获取订单 ID - WooCommerce API
    我想创建一个python脚本,返回只知道客户的账单电子邮件的订单。我尝试这样做,但返回所有最近的订单:fromwoocommerceimportAPIwcapi=API(url="https://siteexample.com",consumer_key="ck_xxx",consumer_secret="cs_xxx",version="wc/v3")......
  • python基础理论小总结
    1.python语言的特性Python是一门解释型语言,简单清晰,开源免费,跨平台,有大量第三方库辅助开发,支持面向对象与自动垃圾回收,方便与其他编程语言相互调用。Python在数据采集、人工智能、WEB后台开发、自动化运维、测试等方向应用广泛。2.解释型语言和编译型语言的区别执行方式不......
  • python编码规范
    本篇讲的是代码格式化的问题,解决格式化的方法在最下方,不想看内容的,滑到最下方就好了。一、变量的命名规则1.组成:字母、数字、下划线2.不可以以数字开头3.不建议使用下划线开头4.命名需见名知意5.不要与关键字重名。如何查找所有关键字?importkeywordprint(keyword.k......
  • Python爬虫开发中的常用库与框架安装指南
    在Python爬虫开发中,选择合适的库和框架可以大大提高开发效率和爬虫的性能。本文将介绍一些常用的解析库、请求库、储存库、Web库、App爬取库以及爬虫框架,并展示如何使用pip命令进行安装。一、解析库1.BeautifulSoupBeautifulSoup是一个用于从HTML或XML文件中提取数据的Pyth......
  • 如何在Python中的指定项目之后添加新项目到嵌套列表?
    给定的列表是这样的。list1=[10,20,[300,400,[5000,6000],500],30,40]预期输出是这样的。我知道这是一个非常基本的问题,但我很困惑。输出:[10,20,[300,400,[5000,6000,7000],500],30,40]我希望有人能帮助我解决这个问题。并解释了嵌套列表的插入功......
  • python带界面实现word文档比对功能
    python实现word文档比对的功能较简单,笔者这里将其界面话,可以指定输入比对的文档,相似度,最小相似参数等。输出的结果以word的形式保存,重复部分会标出,基本实现了商业软件的功能。先看界面这里不废话了,直接给出全部源码,觉得好的点个赞。程序打包的话,自己百度。fromtkinterimp......
  • 具有固定字典键的 Python 函数返回类型提示
    我有一个函数返回一个始终具有相同键的字典(通过网络发送并使用json进行“字符串化”)。基本上我的函数看起来像这样:defgetTemps(self)->dict:"""getroomandcputemperaturein°Caswellashumidityin%"""#sendtemperaturerequesttoserve......