浅谈Python 3.11


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,可以异常增加更多的提示信息

img

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

文章作者: 祈安
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 祈安 !
评论
  目录