python函数注释 typing模块函数类型注解(函数注解)(指定函数参数和返回值类型)Union注解、Callable注解、Optional可变参数注解。类型提示、类型注解
因此,set(“dsf234fdsf”)的结果是一个包含字符串中每个字符的集合:{‘3’, ‘s’, ‘2’, ‘d’, ‘f’, ‘4’}。在函数get_unique_numbers中,参数numbers被注解为List[int],表示它应该是一个整数类型的列表。然而,当你调用get_unique_numbers(“dsf234fdsf”)时,你传递给函数的参数是一个字符串,而不是一个整数列表。
文章目录
- python typing模块
- 效果
- 常用注解语法
- 1. 基本类型注解:可以使用int、float、str等基本类型来注解函数参数和返回值的类型。
- 2. 类型别名注解:可以使用typing模块中的类型别名来注解函数参数和返回值的类型。
- 3. 可选参数注解:可以使用typing模块中的Optional来注解可选参数的类型。
- 4. 可变参数注解:可以使用typing模块中的List或Tuple来注解可变参数的类型。
- 5. 泛型注解:可以使用typing模块中的泛型来注解函数参数和返回值的类型。
- 6. Callable注解:可以使用typing模块中的Callable来注解函数参数和返回值为可调用对象的类型。
- 7. Union注解:Union用于指定一个变量可以是多个不同类型中的一个。
- 8. Dict注解:Dict用于指定一个字典的键和值的类型。
- 9. Set注解:Set用于指定一个集合的元素类型。
- 20231015补充:类参数类型注解
python typing模块
Python的typing模块提供了一种在函数定义中添加类型注解的方式,用于指定函数参数和返回值的类型。这些注解不会在运行时进行类型检查,但可以被静态类型检查工具(如mypy)使用。
效果
为函数添加typing模块的注解后,函数使用者就能清晰的了解函数的参数以及返回值类型,例如:
这是一个没有使用typing函数注解的函数,它的注解都是python自动推导的:
这是一个使用了python typing模块注解的函数,可以看到,尽管此函数返回值类型复杂,但也能清晰展示:
常用注解语法
以下是一些常见的函数注解的功能和用法:
1. 基本类型注解:可以使用int、float、str等基本类型来注解函数参数和返回值的类型。
def add(a: int, b: int) -> int:
return a + b
2. 类型别名注解:可以使用typing模块中的类型别名来注解函数参数和返回值的类型。
from typing import List
def get_length(lst: List[int]) -> int:
return len(lst)
if __name__ == "__main__":
my_list = [1, 2, 3, 4, 5]
print(get_length(my_list))
my_list = list("hello world")
print(get_length(my_list))
运行结果:
5
11
3. 可选参数注解:可以使用typing模块中的Optional来注解可选参数的类型。
from typing import Optional
def greet(name: Optional[str] = None) -> str:
if name:
return f"Hello, {name}!"
else:
return "Hello, world!"
在函数定义中,Optional[str] = None
表示参数name的类型可以是str或None。
注意,= None
可省略。
以下是示例:
from typing import Optional
def greet1(name: Optional[str] = None) -> str:
if name:
return f"Hello, {name}!"
else:
return "Hello, world!"
def greet2(name: Optional[str]) -> str:
if name:
return f"Hello, {name}!"
else:
return "Hello, world!"
if __name__ == "__main__":
print(greet1())
print(greet1())
print(greet1("Arnold"))
print(greet2("Arnold"))
运行结果:
Hello, world!
Hello, world!
Hello, Arnold!
Hello, Arnold!
但是上面两个函数看到还不太一样:
4. 可变参数注解:可以使用typing模块中的List或Tuple来注解可变参数的类型。
from typing import List
def sum_numbers(*numbers: List[int]) -> int:
return sum(numbers)
if __name__ == "__main__":
print(sum_numbers(1,2,3))
print(sum_numbers(1,2))
运行结果:
6
3
5. 泛型注解:可以使用typing模块中的泛型来注解函数参数和返回值的类型。
from typing import List, Tuple
def split_string(s: str) -> Tuple[List[str], List[str]]:
words = s.split()
return words, list(reversed(words))
if __name__ == "__main__":
my_str = "hello world"
words, re_words = split_string(my_str)
print(words)
print(re_words)
运行结果:
['hello', 'world']
['world', 'hello']
6. Callable注解:可以使用typing模块中的Callable来注解函数参数和返回值为可调用对象的类型。
from typing import Callable
def apply_func(func: Callable[[int, int], int], a: int, b: int) -> int:
return func(a, b)
# 定义一个加法函数
def add(a: int, b: int) -> int:
return a + b
if __name__ == "__main__":
# 调用apply_func函数,传入add函数作为参数
result = apply_func(add, 3, 4)
print(result) # 输出:7
看到的注解是这样的:
7. Union注解:Union用于指定一个变量可以是多个不同类型中的一个。
例如,Union[int, float]
表示变量可以是int类型或float类型。
from typing import Union
def square_root(n: Union[int, float]) -> float:
return n ** 0.5
if __name__ == "__main__":
print(square_root(2))
print(square_root(2.44))
运行结果:
2
2.44
8. Dict注解:Dict用于指定一个字典的键和值的类型。
例如,Dict[str, int]
表示键是字符串类型,值是整数类型的字典。示例:
from typing import Dict
def count_letters(s: str) -> Dict[str, int]:
"""
统计字符串中字母出现次数
"""
letter_count = {}
for letter in s:
if letter.isalpha():
# get(letter, 0)表示如果字典中没有找到字母letter,就返回0
letter_count[letter] = letter_count.get(letter, 0) + 1
return letter_count
if __name__ == "__main__":
print(count_letters("dsf234fdsf"))
运行结果:
{'d': 2, 's': 2, 'f': 3}
9. Set注解:Set用于指定一个集合的元素类型。
例如,Set[int]
表示整数类型的集合。示例:
from typing import Set, List
def get_unique_numbers(numbers: List[int]) -> Set[int]:
return set(numbers)
if __name__ == "__main__":
print(get_unique_numbers("dsf234fdsf"))
print(get_unique_numbers([7, 1, 4, 3, 3, 4, 5 ]))
运行结果:
{'f', '4', 'd', '2', 's', '3'}
{1, 3, 4, 5, 7}
在函数get_unique_numbers中,参数numbers被注解为List[int],表示它应该是一个整数类型的列表。然而,当你调用get_unique_numbers(“dsf234fdsf”)时,你传递给函数的参数是一个字符串,而不是一个整数列表。
在Python中,字符串是可迭代的对象,因此它可以被转换为一个列表。当你使用字符串作为参数调用set()函数时,它会将字符串中的每个字符作为集合的元素。因此,set(“dsf234fdsf”)的结果是一个包含字符串中每个字符的集合:{‘3’, ‘s’, ‘2’, ‘d’, ‘f’, ‘4’}。
注意,python set默认是无序的,元素不会自动进行排序。
20231015补充:类参数类型注解
示例:
class NetInterface:
'''
网口类
'''
def __init__(self, name: str, is_main: bool):
self.name = name
# 是否是主网口(主网口涉及到跟java、mysql同步的逻辑)
self.is_main = is_main
class InterfaceIpInfo:
'''
网口 ip 信息类
'''
def __init__(self, net_interface: NetInterface, ip: str, subnet_mask: str, gateway: str):
self.net_interface = net_interface
self.ip = ip
self.subnet_mask = subnet_mask
self.gateway = gateway
更多推荐
所有评论(0)