python中union函数_Python中typing模块详解

Python中typing模块详解

简介​

Python是一门弱类型的语言,很多时候我们可能不清楚函数参数类型或者返回值类型,很有可能导致一些类型没有指定方法,在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度,typing模块可以很好的解决这个问题。​

Python 运行时并不强制标注函数和变量类型。类型标注可被用于第三方工具,比如类型检查器、集成开发环境、静态检查器等。

自python3.5开始,PEP484为python引入了类型注解(type hints),typing的主要作用有:

类型检查,防止运行时出现参数、返回值类型不符。

作为开发文档附加说明,方便使用者调用时传入和返回参数类型。

模块加入不会影响程序的运行不会报正式的错误,pycharm支持typing检查错误时会出现黄色警告。

别名和NewType

1. 类型别名

要定义一个类型别名,可以将一个类型赋给别名。类型别名可用于简化复杂类型签名,在下面示例中,Vector 和 list[float] 将被视为可互换的同义词:

Vector = list[float]

def scale(scalar: float, vector: Vector) -> Vector:

return [scalar * num for num in vector]

# typechecks; a list of floats qualifies as a Vector.

new_vector = scale(2.0, [1.0, -4.2, 5.4])

请注意,None 作为类型提示是一种特殊情况,并且由 type(None) 取代,这是因为None是一个存在于解释器中的单例对象。

2. NewType

使用 NewType辅助函数创建不同的类型,静态类型检查器会将新类型视为它是原始类型的子类。

from typing import NewType

UserId = NewType('UserId', int)

def get_user_name(user_id: UserId) -> str:

...

# typechecks

user_a = get_user_name(UserId(42351))

# does not typecheck; an int is not a UserId

user_b = get_user_name(-1)

仍然可以对 UserId 类型的变量执行所有的 int 支持的操作,但结果将始终为 int 类型。这可以让你在需要 int 的地方传入 UserId,但会阻止你以无效的方式无意中创建 UserId:

# 'output' is of type 'int', not 'UserId'

output = UserId(23413) + UserId(54341)

需要注意,这些检查仅通过静态类型检查程序来强制。NewType返回的是一个函数该函数立即返回传递它的任意值这就意味着UserId(1234)并不会创建一个新的类或引入任何超出常规函数调用的开销。

因此,运行过程中same_val

你可能感兴趣的:(python中union函数)