首页 > 编程问答 >如何输入注释reduce函数?

如何输入注释reduce函数?

时间:2024-07-23 12:02:26浏览次数:5  
标签:python python-typing

我正在 list 之上编写一个非常薄的包装器,并且我想定义一个名为 reduce 的方法,但我正在努力正确注释它,以便 pylance mypy & pylint 剪切它们每当我使用该方法,甚至定义它时,都会抱怨。

我很不安地意识到,Python 的内置库几乎没有类型注释。

这是我的实现尝试:

    def reduce(self, func: Callable[[list[T], list[T]], list[T]] = lambda x, y: x + y, default: Optional[T] = None) -> 'List[T]':  # type: ignore
        from functools import reduce
        if default is None: return List(reduce(func, self.list))  # type: ignore
        return List(reduce(func, self.list, default))  # type: ignore

当我的 List 时,这会失败。实际上是一个字符串列表

a: List[str] = List(['a', 'b'])
b = a.reduce(lambda x, y: x + y)

显然,类型检查器和 linter 表示它们期望 list[T] 而我通过了 str


在类型注释中遇到了问题,因为为 functools.reduce 提供的 func 参数的类型提示不正确。 func 应该接受两个相同类型的参数并返回相同类型的单个值,而不是返回一个列表。

以下是的 reduce 方法的更正后的类型注释:

from typing import TypeVar, Callable, Optional, List

T = TypeVar('T')

class List(list, Generic[T]):
    def reduce(self, func: Callable[[T, T], T], default: Optional[T] = None) -> T:
        from functools import reduce
        if default is None:
            return reduce(func, self)
        return reduce(func, self, default)

a: List[str] = List(['a', 'b'])
b = a.reduce(lambda x, y: x + y)  # b 现在是 'ab'

此代码段中所做的更改:

  1. 更正 func 的类型提示: Callable[[T, T], T] 现在正确反映了 func 应该接受两个类型为 T 的参数并返回一个类型为 T 的值的函数。
  2. 删除不必要的列表转换: functools.reduce 已经返回一个单值,因此不需要 List() 构造函数。
  3. 简化类型注释: List[T] 可以简单地写成 T ,因为 reduce 返回一个单值,而不是一个列表。

使用这些更正,的代码现在应该可以被 pylance mypy pylint 正确类型检查,并且不会再出现错误。

标签:python,python-typing
From: 77075348

相关文章

  • Python字段的字符串注释
    Python是否支持类字段的任何类型的字符串注释?例如,在Golang中,我可以定义这样的结构,带有可选的字符串标签:typeUserstruct{Namestring`example:"name"`}我需要在Python中定义一个新类,其中包含包含点.的字段名称。我希望可能有某种方法来注释字段,或者......
  • 具有未定义变量和注释的有效 Python 行
    我来了一篇文章,其中包含未定义的变量名称和某些类型注释。该行有效。它有什么作用以及可能的用途是什么?withundefinedvariablenamewithsometypeannotation.Thelineisvalid.Whatitdoesandwhatarepossibleusages?>>>x:int>>>xTraceback(mostr......
  • 使用 Python 通过逻辑应用运行长时间运行的 Azure Functions
    我已经尝试解决这个问题有一段时间了,但我似乎找不到解决方案。因此,正如标题所示,我试图通过函数在逻辑应用程序中运行长时间运行的操作。我有一个python代码,可以比较2个excel文件并进行一些转换。它工作正常,但是,Excel文件包含近20k行(它是动态的,将来会添加更多行),因此......
  • 使用递归函数计算阶乘时,我在 python 中遇到类型错误
    defcalc_fact(n):如果(n==1或n==0):返回1别的:n*calc_fact(n-1)print(calc_fact(5))试图创建函数来计算阶乘,不支持类型错误操作数*:对于int或Nonetype我不知道为什么谢谢Python代码中出现“类型错误:不支持的操作数类型为*:'int'和'NoneType'”表明你......
  • 如何调试 python Flask [84] [CRITICAL] WORKER TIMEOUT?
    调试:gtts.tts:保存到temp.mp37月22日09:10:56PM[2024-07-2215:40:56+0000][84][严重]工作超时(pid:87)|||7月22日09:10:56PM[2024-07-2215:40:56+0000][87][INFO]工人退出(pid:87)7月22日09:10:57PM[2024-07-2215:40:57+0000][95][INF......
  • 类型错误:无法将函数返回值转换为 Python 类型!签名是 () -> 处理 anaconda spider
    这是代码:importosimportrandomimportnumpyasnpimportpandasaspdimporttensorflowastffromtensorflow.kerasimportbackendasKfromtensorflow.keras.layersimportDense,Dropout,Flatten,Conv2D,MaxPool2D,Input......
  • python进阶---闭包与装饰器
    一、闭包        在Python中,闭包是指一个函数内部定义的函数,这个内部函数可以访问并修改其外部函数的局部变量,即使外部函数已经执行完毕。闭包可以通过多层函数嵌套来实现。    闭包的三要素:    1、外部函数嵌套内部函数    2、外部函数返......
  • 强制从当前包自动导入的 Python 以此包的名称为前缀
    我在VSCode中使用Python和Pylance扩展。在我正在编辑的自己的包中,自动添加的导入(设置“导入格式:绝对”)如下所示:frommydirectory.myfileimportmyclass但是,我的Python包正在被被一个(非常愚蠢且不可协商的)外部系统消耗,该系统拒绝正确解释它,除非导入的格式特别......
  • Python语言-面向对象
    知识代码classJobSalary(object):job=''def__init__(self,city):self.jobname="数据分析师"self.exp=''self.city=city#方法defdata_normalize(self,data):print(f'正在规范化......
  • 需要帮助使用 Selenium Python 单击 Microsoft Teams 按钮
    我将Python与Selenium结合使用,并自动登录MicrosoftTeams。进入后,弹出窗口显示我需要单击“立即切换”以切换到V2版本。我似乎无法使用SeleniumPython成功单击此按钮。谁能帮我自动点击这个按钮?这是我不成功的尝试:self.driver.find_element(By.CLASS_NAME,......