Python 3.11
浅谈Python 3.11
1、性能提升
Python 3.11 比 Python 3.10 快10-60%
(通过dockerbub中 python官方的测试集进行比对 python:bullseye, docker pull python:bullseye)
2、更好的错误信息提示
错误提示信息更加准确
python 2.7
>>> response['a']['b']['c']['user']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object has no attribute '__getitem__'
>>>
python 3.11
>>> response=1
>>> response['a']['b']['c']['user']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not subscriptable
>>>
3、新增异常类的add_note方法
异常类增加了add_note,可以异常增加更多的提示信息
python 3.11增加add_note方法
try:
raise TypeError('str')
except TypeError as e:
e.add_note('类型错了')
e.add_note('该用int')
raise e
抛出的异常信息
Traceback (most recent call last):
File "d:\py311\test.py", line 6, in <module>
raise e
File "d:\py311\test.py", line 2, in <module>
raise TypeError('str')
TypeError: str
类型错了
该用int
4、支持抛出抛出异常组
异常组是python3.11 新加的概念,需要使用**except***进行捕获
特别注意是异常组ExceptionGroup,不是异常的组合[exception1,exception2,…]
异常组的定义
eg1 = ExceptionGroup("one error", [ValueError(654)])
eg2 = ExceptionGroup("two errors", [ValueError(654), TypeError("int")])
ExceptionGroup('two errors', [ValueError(654), TypeError('int')])
eg3 = ExceptionGroup("no errors", [])
异常组用于处理抛出的多个异常,在之前Python3.11 之前版本,只能处理一个异常
try:
raise ExceptionGroup(
"group", [TypeError("str"), ValueError(654), TypeError("int")]
)
except* ValueError as eg:
print(f"Handling ValueError: {eg.exceptions}")
except* TypeError as eg:
print(f"Handling TypeError: {eg.exceptions}")
#Handling ValueError: (ValueError(654),)
#Handling TypeError: (TypeError('str'), TypeError('int'))
5、增加内置支持toml格式解析
新增toml格式文本解析,支持从文件读取和字符串中读取
目前python 3.11 内置的文本格式解析已经包括:json、toml、ini、xml,尚不支持的有yaml
import tomllib
with open('123.toml', 'rb') as fd:
data = tomllib.load(fd)
toml_str = """
[owner]
name = "Tom Preston-Werner"
dob = 1979-05-27T07:32:00-08:00
"""
data = tomllib.loads(toml_str)
6、更强的类型标注
(1)LiteralString
目前,试了vscode 和mypy 没有报错,需要等mypy更新
from typing import LiteralString
user_id = '1'
query = f'select * from user where user_id = {user_id}'
def test(sql: LiteralString) -> None:
print(sql)
test(sql=query)
(2)TypedDict、NotRequired、Required
类型字典,非必选属性和必选属性
from typing import List, TypedDict, NotRequired, Required
class User(TypedDict):
name: str
age: NotRequired[int]
class Teacher(TypedDict):
name: Required[str]
students: NotRequired[List[User]]
(3)Self
表示自身的类型
from typing import Any, Self
class Node:
def __init__(self, value: Any) -> Self:
self.value = value