27.Python 变量类型、返回值类型及`...`
AI-摘要
Tianli GPT
AI初始化中...
介绍自己 🙈
生成本文简介 👋
推荐相关文章 📖
前往主页 🏠
前往爱发电购买
27.Python 变量类型、返回值类型及`...`
Pupper
Python 3.6+ 版本
加入了对类型提示
的支持
这些类型提示
是一种新的语法, 用来声明一个变量的类型
没啥用的 *前言* 废话
- Python是一种动态类型语言,这意味着我们在编写代码的时候更为自由,运行时不需要指定变量类型
- 但是与此同时 IDE 无法像静态类型语言那样分析代码,及时给我们相应的提示,比如字符串的 split 方法
1 | def split_str(s); |
由于不知道参数 s 是什么类型,所以当你敲 s. 的时候不会出现 split 的语法提示
解决上述问题,类型提示
Python 3.5、3.6 新增了两个特性 PEP 484 和 PEP 526
- 变量提示:PEP 484:https://www.python.org/dev/peps/pep-0484/
- 函数参数提示:PEP 526:https://www.python.org/dev/peps/pep-0526/
帮助 IDE 为我们提供更智能的提示
这些新特性不会影响语言本身,只是增加一点提示
简单类型
1 | num: int = 0 # int 变量, 默认值为 0 |
1 | def get_name_with_age(name: str, age: int): |
- 变量标注了类型, 传错类型运行
不会报错
, 只是在 IDE 有智能语法⚠️警告提示 - 类型提示更像一个规范约束, 而不是语法限制
嵌套类型
使用 Python 的 typing 标准库来声明这些类型以及子类型
列表
- 变量 items 是一个 list,并且这个列表里的每一个元素都是 str
1 | from typing import List |
元组和集合
- 变量 items_t 是一个 tuple,其中的前两个元素都是 int 类型, 最后一个元素是 str 类型
- 变量 items_s 是一个 set,其中的每个元素都是 bytes 类型
1 | from typing import Set, Tuple |
元组打包、解包
打包
1 | t1: Tuple[int, ...] = (1,2,3) # 元组加上类型打包 |
解包
1 | from typing import List |
字典
变量 prices 是一个 dict:
- 这个 dict 的所有键为 str 类型
- 这个 dict 的所有值为 float 类型
1 | from typing import Dict |
类作为类型
假设有 Person
类, 拥有 name 属性, 则可以将一个变量声明为 Person
类型
1 | class Person: |
返回值类型
1 | def say_hi(name: str) -> str: |
1 | def add(first: int = 10, second: float = 5.5) -> float: |
如果要避免循环导入或者注解早于对象定义的情况, 可以用字符串代替类型, 效果相同
1 | def hello(p: 'Person') -> str: |
如果你实在不知道某个类型注解应该怎么写时,这里还有个最后的逃生通道
任何类型都与 Any 兼容。当然如果你把所有的类型都注解为 Any 将毫无意义,因此 Any 应当尽量少使用。
1 | from typing import Any |
泛型
假设有一个函数,要求它既能够处理字符串,又能够处理数字, 参数的类型不可以混着用(比如 a: int 且 b:str ), 就要使用泛型
1 | from typing import TypeVar, List |
- 定义两个泛型 K 和 V,对它两的类型没有做任何限制,也就是说可以是任意类型。
- 函数 get_item() 接受两个参数。
- 这个函数不关心参数 container 字典的键是什么类型,或者字典的值是什么类型;
- 但它的参数 container 必须是字典,参数 key 必须与字典的键为同类型,并且返回值和字典的值必须为同类型。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26from typing import Dict, TypeVar
# 定义泛型 K 和 V
# K 和 V 的具体类型没有限制
K = TypeVar("K")
V = TypeVar("V")
def get_item(key: K, container: Dict[K, V]) -> V:
return container[key]
dict_1 = {"age": 10}
dict_2 = {99: "dusai"}
print(get_item("age", dict_1))
# 例1
# 类型检查通过,输出: 10
print(get_item(99, dict_2))
# 例2
# 类型检查通过,输出: dusai
print(get_item("name", dict_2))
# 例3
# 类型检查失败
# 因为"name"是字符串,而dict_2的键为整型...
在Python中一切皆对象,
...
也是一个对象...
在 Python 中叫Ellipsis
1 | print(...) # Ellipsis |
类型提示
1 | from typing import Callable, Tuple |
函数内部, 相当于 pass
1 | def foo1(): pass |
目前正流行开来的高性能 Web 框架 FastAPI 中,也应用了 Ellipsis。它用以表示参数是必填项,这在 Swagger 页面更能直观体现。
Query 对象的第一个参数是默认值 None,请求的时候可以将其省略.
1 | # 如果想做一些验证,比如最小长度是 10,并且是可选的,可以写成这样 |
numpy 中的索引
1 | import numpy as np |
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果