说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python 3.12 版本增加了 type 语句,用来声明类型别名,它是 typing.TypeAliasType 的实例,利用 type 语句我们可以更加快捷地定义一个类型的别名,通过这种语法的演进,足以表明 Python 对类型标记功能完善的重视。
类型别名是某些编程语言中的一种功能,它允许创建使用其他名称引用类型。它不会创建新的类型,因此不会增加类型安全性。它可以用来缩短长名称。允许类型别名的编程语言包括C++、D、Dart、Elixir、Elm、F#、Go、Hack、Haskell、Julia、Kotlin、Nim、Python、Rust、Scala、Swift 和 TypeScript。
定义一个向量数据类型:
type Vector = list[float]
def scale[T](scalar: float, vector: Vector) -> Vector:
return [scalar * num for num in vector]
# passes type checking; a list of floats qualifies as a Vector.
new_vector = scale(2.0, [1.0, -4.2, 5.4])
print(new_vector)
# [2.0, -8.4, 10.8]
可以简化定义类型的代码。之前定义一个泛型类看起来是这样的。
from typing import Generic, TypeVar
_T_co = TypeVar("_T_co", covariant=True, bound=str)
class ClassA(Generic[_T_co]):
def method1(self) -> _T_co:
...
新语法下:
class ClassA[T: str]:
def method1(self) -> T:
...
下面是一个通用函数的例子。
from typing import TypeVar
_T = TypeVar("_T")
def func(a: _T, b: _T) -> _T:
...
新的语法:
def func[T](a: T, b: T) -> T:
...
下面是一个通用类型别名的例子。
from typing import TypeAlias
_T = TypeVar("_T")
ListOrSet: TypeAlias = list[_T] | set[_T]
使用新语法。
type ListOrSet[T] = list[T] | set[T]
这是 Python 3.12 新功能,type 语句语法表示如下:
type_stmt ::= 'type' identifier [type_params] "=" expression
type 语句声明一个类型别名,即 typing.TypeAliasType 的实例。
例如,以下语句创建了一个类型别名:
type Point = tuple[float, float]
此代码大致等价于:
annotation-def VALUE_OF_Point():
return tuple[float, float]
Point = typing.TypeAliasType("Point", VALUE_OF_Point())
annotation-def 指定一个 标注作用域,其行为很像是一个函数,但有几个小差别。
类型别名的值是在标注作用域中被求值的。 当创建类型别名时它不会被求值,只有当通过该类型别名的 __value__
属性访问时它才会被求值 (参见 惰性求值)。 这允许类型别名引用尚未被定义的名称。
类型别名可以通过在名称之后添加 类型形参列表来泛型化。
type 是一个 软关键字。
要注意的是,在 type 语句中,type 是一个软关键字,它并不是一个关键字,同时我们还应该知道,它也是一个 Python 内置函数(类),详见:Python type() 对象的类型 。
亦可浏览:
更新时间:Oct. 18, 2023, 7:47 p.m. 标签:python 类型 语句