Python typing模块(类型标注)(type hints)(一) —— NewType & Callable可调/回调 & Union或 & Any & Optional

typing 是python3.5中开始新增的专用于类型注解(type hints)的模块,为python程序提供静态类型检查

    注意Python 运行时不强制执行函数和变量类型注解,但这些注解可用于类型检查器、IDE、静态检查器等第三方工具。

typing常用类型

  • int、long、float:整型、长整形、浮点型
  • bool、str:布尔型、字符串类型
  • List、 Tuple、 Dict、 Set:列表、元组、字典、集合
  • Iterable、Iterator:可迭代类型、迭代器类型
  • Generator:生成器类型

模块常用的类型有 Any, Union, Tuple, Callable, TypeVar,Optional和Generic等

简单的类型注解及其形式就如 Python Type Hint(类型标注/类型提示) (箭头 ->)(type annotation)_hxxjxw的博客-CSDN博客_python 箭头

是默认的int、str等简单类型

也可以用自己自定义的类

class My(object):  
    pass  

def get() -> My:  
    return My()  

get()

举例

1. List, Tuple, Dict

from typing import List
def func(a: int, string: str) -> List[int or str]: # 使用or关键字表示多种类型
    list1 = []
    list1.append(a)
    list1.append(string)
    return list1
if __name__ == '__main__':
    func(1, 'a')

from typing import List, Tuple, Dict

def add(a: int, string: str, f: float, b: bool) -> Tuple[List, Tuple, Dict, bool]:
    list1 = list(range(a))
    tup = (string, string, string)
    d = {"a": f}
    bl = b
    return list1, tup, d, bl
print(add(5, "hhhh", 2.3, False))

2. 别名  Type aliases

我们可以通过给类型赋予别名,简化类型注释,如下例中,毫无疑问,函数broadcast_message2的注解明显比broadcast_message更加简洁清晰。

from typing import Dict, Tuple, Sequence

ConnectionOptions = Dict[str, str]
Address = Tuple[str, int]
Server = Tuple[Address, ConnectionOptions]

def broadcast_message(message: str, servers: Sequence[Server]) -> None:
    pass

def broadcast_message2(
        message: str,
        servers: Sequence[Tuple[Tuple[str, int], Dict[str, str]]]) -> None:
    pass

3. NewType

可以使用NewType来创建一个用户自定义类型

NewType() 是一个辅助函数,用于向类型检查器指示不同的类型,在运行时,它返回一个函数,该函数返回其参数。

from typing import NewType
 
UserId = NewType('UserId', int)

def name_by_id(user_id: UserId) -> str:
    print(user_id)
 
UserId('user')  # Fails type check
num = UserId(5)  # type: int
 
name_by_id(42)  # Fails type check
name_by_id(UserId(42))  # OK

print(type(UserId(5)))

4. Callable 可调对象

 Callable[[int], str] 是把(int)转为 str 的函数

from typing import Callable

def f(a: int) -> str:
    return str(a)

def callback(a: int, func: Callable[[int], str]) -> str:
    return func(a)

print(callback(1, f))

5. Union 或

让其返回值的类型可能是int,也可能是My的实例。

Union类型,表示 

例如下方的例子就是,get返回值的就是[My, int]中的任意一个。

from typing import Union  
  
class My(object):  
    pass
def get() -> Union[My, int]:  
    return My()

get()

在3.10版本后,支持更加精简的写法:
 

My | int

6. Any

静态类型检查器会将每种类型都视为与 Any 兼容,将 Any 视为与每种类型兼容

from typing import Any

a = None  # type: Any
a1 = []  # OK
a2 = 2  # OK

s = ''  # type: str
s1 = a  # OK

def foo(item: Any) -> int:
    # Typechecks; 'item' 可以是任意类型
    print(item)
    return 1

foo(a)
foo(a1)
foo(a2)
foo(s)
foo(s1)

所以,所有没有返回类型或参数类型的函数将隐式默认使用 Any

def legacy_parser(text):
    ...
    return data

# 上述写法等价于下述写法

def legacy_parser(text: Any) -> Any:
    ...
    return data

7. Optional

可选类型

  • Optional[int] 等价于 Union[int, None]
  • 意味着:既可以传指定的类型 int,也可以传 None

Optional 和默认参数其实没啥实质上的区别,只是写法不同

使用 Optional 是为了让 IDE 识别到该参数有一个类型提示,可以传指定的类型和 None,且参数是可选非必传的

from typing import Optional
def foo_func(arg: Optional[int] = None):
    print(arg)

foo_func()
foo_func(1)

 使用默认参数的写法

def foo_func(arg: int = None):
    print(arg)

foo_func()
foo_func(1)

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值