首页 >后端开发 >Python教程 >在 Python 中注释函数

在 Python 中注释函数

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-27 20:36:11740浏览

Annotating Functions in 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]

例如;

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 inner     

n = multiplier(6)
n(8) #48

我们可以创建一个名为 number 的 TypeAlias,它是 int 和 float 的联合(字面意思),例如;

from typing import TypeAlias, Union

number: TypeAlias = Union[int, float]

将参数视为JavaScript 数字.

因此,要注释这个函数,我们有;

def multiplier(factor: number) -> Callable[[number], number]:
    def inner(value: number) -> inner:
        return value * factor
    return inner

a = 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 TypeVar

T = TypeVar("T") # the argument and the name of the variable should be the same

这样我们就有

from typing import TypeVar, Sequence

def pick(array: Sequence[T], index: int) -> T:
    return array[index]

print(pick([1,2,3,4], 2))

那么自定义 myMap 函数怎么样,它的作用类似于 JavaScript 中的地图。这样我们就有了;

记住:Python中的map()返回的是Iterable类型而不是List类型

def myMap(array, fn):
    return map(fn, array)

def twice(n): return n * 2
print(myMap([1,2,3], twice))

我们可以混合使用 Callable 和 TypeVar 类型来注释这个函数。 观察...

from typing import TypeVar, Iterable, Callable

Input = TypeVar("Input")  # Input and "Input" must be the same
Output = TypeVar("Output")

def myMap(array: Iterable[Input], fn: Callable[[Input], Output]) -> Iterable[Output]:
    return map(fn, array)

def twice(n: int) -> int: return n * 2
print(myMap([1,2,3], twice))

或者我们可以别名 Callable 函数

from typing import TypeVar, Iterable, Callable

Input = TypeVar("Input")
Output = TypeVar("Output")

MappableFunction = Callable[[Input], Output]

def myMap(array: Iterable[Input], fn: MappableFunction[Input, Output]) -> Iterable[Output]:
    return map(fn, array)

观察 MappableFunction 接受这些泛型类型输入和输出并将它们应用到 Callable[[Input], Output] 的上下文中。

花点时间想想 myFilter 函数将如何注释?

好吧,如果你想到了这个

from typing import Iterable, TypeVar, Callable

Input = TypeVar("Input")

def myFilter(array: Iterable[Input], fn: Callable[[Input], bool]) -> Iterable[Input]:
    return filter(fn, array)

你说得对

通用类

我知道我不应该谈论类注释,但请给我一些时间来解释泛型类。

如果您来自Typescript诗句,这就是您定义它们的方式

class GenericStore<Type>{
    stores: Array<Type> = []

    constructor(){
        this.stores = []
    }

    add(item: Type){
        this.stores.push(item)
    }
}

const g1 = new GenericStore<string>(); //g1.stores: Array<string>
g1.add("Hello") //only string are allowed

但在 Python 中它们却相当不同且尴尬。

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

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

Callable[[argtype1, argtype2, argtype3], returnType]

为什么我应该学习如何在 Python 中注释函数?

正如我在上一篇博客中所说,它有助于构建更智能的类型系统,从而减少出现错误的机会(特别是在使用 mypy 等静态文件检查器时)。此外,当使用强大的类型系统编写库(或 SDK)时,可以大幅提高使用该库的开发人员的工作效率(主要是因为编辑器的建议

如果您有任何疑问或者本文中存在错误,请随时在下面的评论中分享⭐

以上是在 Python 中注释函数的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn