在 Python 中注释函数

在 python 中注释函数

最近,我撰写了一篇关于TypeScript函数注释的博文。 深入研究后,我了解了更多关于Python函数注释的知识。 本文将使用与上一篇博文类似的示例,讲解Python函数的注释方法。

您可以通过将python.analysis.typecheckingMode设置为basic、standard或strict来验证Visual Studio Code中的类型注释。 basic和standard选项不一定能保证您对函数和变量的注释正确性,但strict模式可以。

函数作为值

您可以在Python中返回函数,并将函数作为值传递。回调函数实际上使用callable类型进行注释,其语法如下:

callable[[argtype1, argtype2, argtype3], returntype]

登录后复制

例如,函数length(text: str) -> int将被注释为callable[[str], int]。

立即学习“Python免费学习笔记(深入)”;

例如,JavaScript中的这个函数:

function multiplier(factor){    return value => factor * value}const n = multiplier(6)n(8) // 48

登录后复制

在Python中可以这样写:

def multiplier(factor):    def inner(value):        return value * factor    return innern = multiplier(6)n(8) # 48

登录后复制

我们可以创建一个名为number的类型别名,它是int和float的联合类型:

from typing import typealias, Unionnumber: typealias = Union[int, float]

登录后复制

将参数视为JavaScript数字。

因此,要注释此函数,我们有:

def multiplier(factor: number) -> callable[[number], number]:    def inner(value: number) -> number:        return value * factor    return innera = multiplier(4.5)a(3) # 13.5

登录后复制

泛型函数

经典的泛型函数示例是:

def pick(array, index):    return array[index]pick([1,2,3], 2) # 3

登录后复制

使用TypeVar,我们可以创建更详细的泛型信息(比TypeScript更详细)。

from typing import TypeVart = TypeVar("t")  # 参数名和变量名必须相同

登录后复制

这样我们就有:

from typing import TypeVar, Sequencedef pick(array: Sequence[t], index: int) -> t:    return array[index]print(pick([1,2,3,4], 2))

登录后复制

那么自定义mymap函数呢?它的作用类似于JavaScript中的map函数。

注意: Python中的map()返回的是迭代器,而不是列表。

def mymap(array, fn):    return map(fn, array)def twice(n): return n * 2print(mymap([1,2,3], twice))

登录后复制

我们可以混合使用callable和TypeVar类型来注释此函数。

from typing import TypeVar, Iterable, Callableinput_type = TypeVar("input_type")output_type = TypeVar("output_type")def mymap(array: Iterable[input_type], fn: Callable[[input_type], output_type]) -> Iterable[output_type]:    return map(fn, array)def twice(n: int) -> int: return n * 2print(mymap([1,2,3], twice))

登录后复制

或者我们可以为callable函数创建别名:

from typing import TypeVar, Iterable, Callableinput_type = TypeVar("input_type")output_type = TypeVar("output_type")MappableFunction = Callable[[input_type], output_type]def mymap(array: Iterable[input_type], fn: MappableFunction) -> Iterable[output_type]:    return map(fn, array)

登录后复制

MappableFunction接受泛型类型输入和输出,并将它们应用到Callable[[input_type], output_type]上下文中。

思考一下myfilter函数该如何注释?

如果您想到了这个:

from typing import Iterable, TypeVar, Callableinput_type = TypeVar("input_type")def myfilter(array: Iterable[input_type], fn: Callable[[input_type], bool]) -> Iterable[input_type]:    return filter(fn, array)

登录后复制

您答对了!

泛型类

Python中的泛型类与TypeScript中的定义方式有所不同。

在TypeScript中,您可以这样定义:

class genericstore{    stores: type[] = []    constructor(){        this.stores = []    }    add(item: type){        this.stores.push(item)    }}const g1 = new genericstore(); //g1.stores: string[]g1.add("hello") // only strings are allowed

登录后复制

但在Python中,它们相当不同。

首先,我们导入Generic类型,然后让它们成为泛型类的子类。

因此,要在Python中重新创建这个GenericStore类:

from typing import Generic, TypeVarfrom dataclasses import dataclassType = TypeVar("Type")@dataclassclass GenericStore(Generic[Type]):    store: list[Type] = []    def add(self, item: Type) -> None:        self.store.append(item)g1 = GenericStore([True, False]) # g1.store: list[bool]g1.add(False) # only bool is allowed

登录后复制

为什么要学习Python函数注释?

函数注释有助于构建更强大的类型系统,从而减少错误的可能性(尤其是在使用mypy等静态类型检查器时)。此外,当使用强大的类型系统编写库(或SDK)时,可以显著提高使用该库的开发人员的工作效率(主要是因为编辑器的代码提示)。

如果您有任何疑问或发现本文中的错误,请随时在评论区留言。

以上就是在 Python 中注释函数的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2174507.html

(0)
上一篇 2025年2月25日 12:18:45
下一篇 2025年2月25日 12:19:03

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 高德地图为什么没有声音播报

    高德地图导航没声音?可能是这些原因!本文将指导您排查高德地图导航无声音播报问题,并提供详细的解决方法。 高德地图导航无声音播报的解决方法 高德地图导航通常具备语音播报功能,如果您的地图没有声音,可能是以下原因: 导航播报功能未开启: 请检查…

    2025年4月1日
    100
  • jmcomic为什么不能更新

    jmcomic无法更新的原因多种多样,可能与网站本身、版权、漫画本身以及地区限制等因素有关。 JMComic更新失败的可能原因 网站或应用故障: JMComic网站或应用可能正在维护中,或者遇到技术问题导致无法更新。建议稍后再尝试。 版权问…

    2025年4月1日
    100
  • 可可影视为什么不能投屏

    可可影视,全平台兼容的影音播放神器!支持手机、平板电脑和电视等多种设备,并提供在线播放和本地下载功能,更有多种投屏方式,让您的观影体验更加便捷丰富。 可可影视投屏指南 您是否遇到可可影视投屏问题?其实,可可影视完全支持投屏功能,并提供多种投…

    2025年4月1日
    100
  • 音响失声了,原因究竟是什么(解决音响无声问题的实用方法与技巧)

    在享受美妙音乐或观看电影时,突然发现音响失去声音可能会让人感到困惑和沮丧。为什么音响没有声音了?在本文中,我们将探讨一些常见的原因,并提供解决这个问题的实用方法和技巧。 电源问题如果音响突然没有声音了,首先要检查电源连接是否正常。有时候电源…

    2025年4月1日
    100
  • 百度“秒哒”上线:不会写代码?靠“嘴”开发App的时代来了

    不用敲代码,说句话就能开发app?此前,在百度ai开发者大会上,李彦宏就早早做出判断,称“自然语言将成为新的通用编程语言,只要会说话,就可以成为一名开发者。”当时听起来还觉得像科幻片,但看到前两天百度新推出的“秒哒”平台,是真的做到了。 秒…

    2025年4月1日 互联网
    100
  • CSS position: sticky究竟是如何工作的?

    深入探究CSS position: sticky属性的特性 许多教程将position: sticky描述为relative和fixed定位的结合,认为在到达滚动阈值前,元素表现得像relative定位。然而,实际应用中,很多开发者发现阈值…

    2025年4月1日
    100
  • 为什么我的两个盒子无法并排显示?

    排查并解决子元素无法并排显示的问题 网页布局中,子元素排列问题时有发生。本文分析一个案例:两个子盒子(box1和box2)无法在父容器(container)中并排显示,每个盒子应占据父容器一半宽度。 问题:以下代码导致两个盒子无法同行显示:…

    2025年4月1日
    100
  • CSS导航栏阴影报错:为什么rgb(0 0 0 / 50%)会失效?

    CSS导航栏阴影设置报错及解决方案 在为导航栏添加阴影效果时,使用box-shadow属性和rgb(0 0 0 / 50%)颜色值时,出现了部署错误。 尽管使用了!important强制优先级,问题依然存在。 然而,将颜色值替换为rgba(…

    2025年4月1日
    100
  • CSS布局难题:为什么文字会与容器重叠?

    巧妙的 css 布局:文字与容器的重叠现象及解决方法 本文将探讨一种特殊的 CSS 布局方式,并解释为何会出现文字与 div 覆盖区域重叠的现象。问题源于一个网页排版,其结构包含链接、图片和一段文字,呈现出三行横排的布局效果,然而文字却与上…

    编程技术 2025年4月1日
    100
  • Canvas画布宽度溢出时,父容器为何不显示水平滚动条?

    关于canvas画布与父容器溢出设置的探讨 在使用HTML5 Canvas结合JavaScript库(例如fabric.js)进行绘图时,经常会遇到父容器溢出设置的问题。 本文将针对一个具体案例进行分析,解释为什么在设置了overflow:…

    编程技术 2025年4月1日
    100

发表回复

登录后才能评论