python typing sequence_python3.8 typing 使用规范

参考来源:https://docs.python.org/zh-cn/3.8/library/typing.html

入参出参规则一致

简单变量直接返回,例如:str int float bool

若返回代码中或第三方包的类/实例,则使用导入类

class A:

pass

def test() -> A:

a = A()

return a

若代码中对象(变量/类/方法)不可变更/继承,则必须尽量(最好、必须)使用Final声明,详情使用方法参阅https://blog.csdn.net/youzi_yun/article/details/108983855, 来自官方文档:https://www.python.org/dev/peps/pep-0591/

常用类型:

内置:str int float bool list dict tuple set

from typing import List, Dict, Tuple, Set, Union, Optional, Any, Final

python3.8支持从typing导入的类型如下:

## 来自内置

'Dict', # Dict[str, int], 必须写明key、value的类型,尽量保证value类型一致,如果不一致,则直接返回dict或Dict[str, Any]

'Set', # Set[int], 变量必须是同一类型,如果不一致,则直接返回set或Set[Any]

'List', # List[int], 变量必须是同一类型,如果不一致,则直接返回list或List[Any]

'Set', # Set[int], 变量必须是同一类型,如果不一致,则直接返回set即可

'FrozenSet', # 冻结的集合,冻结后集合不能再添加或删除任何元素。FrozenSet[int] 变量必须是同一类型,如果不一致,则直接返回frozenset或FrozenSet[Any]

## 特殊类型

'Any', # Any 是一种特殊的类型。静态类型检查器将所有类型视为与 Any 兼容,反之亦然, Any 也与所有类型相兼容。

'Callable', # 期望特定签名的回调函数的框架可以将类型标注为 Callable[[Arg1Type, Arg2Type], ReturnType]。

def feeder(get_next_item: Callable[[int], str]) -> None:

pass

'ClassVar', # 用于标记类变量的特殊类型构造。

class Starship:

stats: ClassVar[Dict[str, int]] = {} # class variable

damage: int = 10 # instance variable

'Final', # 最终限定符,声明不应重写的方法;声明一个类不应该被子类化;声明不应重新分配变量或属性。

类型检查器禁止对象在子类中被覆盖。

Final只能用作赋值或变量注释中的最外面的类型。在其他任何位置使用它都是错误的

Final不能在函数参数的注释中使用

eg:

MAX_SIZE: Final = 9000

MAX_SIZE += 1 # Error reported by type checker

'ForwardRef', # 用于字符串正向引用的内部类型表示的类。例如,List["SomeClass"]被隐式转换为 List[ForwardRef("SomeClass")]。此类不应由用户实例。

'Generic', # 泛型类:用户定义的类

'Literal', # 不能被子类化,检查固定值或几个固定值之一,可用于类型检查。

eg:

def validate_simple(data: Any) -> Literal[True]: # always returns True

...

MODE = Literal['r', 'rb', 'w', 'wb']

def open_helper(file: str, mode: MODE) -> str:

...

'Optional', # Optional[X]等价于Union[X, None]

'Protocol', # 协议类的基类

'Tuple', # Tuple[int, str] 代表返回(1, '1'), 如果有多个同类型返回值,可写为Tuple[str, ...], 若返回数量类型都很多,可直接返回tuple或Tuple[Any]

'Type',

'TypeVar', # 类型变量

'Union', # 联合类型 Union[X, Y] 意味着:要么是X,要么是Y

## 来自collections

'ChainMap', # collections.ChainMap

'Counter', # collections.Counter

'Deque', # collections.deque

'DefaultDict', # collections.defaultdict DefaultDict[str, int] 必须写明key、value的类型,尽量保证value类型一致,如果不一致,则直接返回DefaultDict或DefaultDict[str, Any]

'OrderedDict', # collections.OrderedDict OrderedDict[str, int] # 必须写明key、value的类型,尽量保证value类型一致,如果不一致,则直接返回OrderedDict或OrderedDict[str, Any]

'Generator', # collections.abc.Generator

'NamedTuple', # Not really a type.

'TypedDict', # Not really a type.

## ABCs (来自 collections.abc).

'AbstractSet', # collections.abc.Set.

'ByteString',

'Container',

'ContextManager',

'Hashable',

'ItemsView',

'Iterable',

'Iterator',

'KeysView',

'Mapping',

'MappingView',

'MutableMapping',

'MutableSequence',

'MutableSet',

'Sequence', # 鸭子类型,可以看做是任何带有.__len__()和.__getitem__()实现的对象

'Sized',

'ValuesView',

'Awaitable',

'AsyncIterator',

'AsyncIterable',

'Coroutine',

'Collection',

'AsyncGenerator',

'AsyncContextManager',

'Reversible',

'SupportsAbs',

'SupportsBytes',

'SupportsComplex',

'SupportsFloat',

'SupportsIndex',

'SupportsInt',

'SupportsRound',

# One-off things.

'AnyStr',

'cast',

'final',

'get_args',

'get_origin',

'get_type_hints',

'NewType', # 使用 NewType() 辅助函数创建不同的类型 UserId = NewType('UserId', int)

'no_type_check',

'no_type_check_decorator',

'NoReturn', # 注释那些从未期望正常返回的函数,比如方法中都是raise

'overload',

'runtime_checkable',

'Text',

'TYPE_CHECKING',

若需要获得向前引用, 可使用from future import annotations

from __future__ import annotations

class Deck:

@classmethod

def create(cls, shuffle: bool = False) -> Deck:

pass

通常不应注释self或cls参数

注释*args和**kwargs,应该注释每个可能的关键字参数的类型

def test(*args: str, **kwargs: Union[str, int]):

pass

test('', a=1, b='')

原文链接:https://blog.csdn.net/youzi_yun/article/details/108981334

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值