3.12【2023-6】
总结
新语法特性:
- PEP 701: f-strings的语法形式化
新类型特性:
- PEP 688: 使缓冲协议在Python中可访问
- PEP 692: 使用TypedDict实现更精确的**kwargs类型化
- PEP 695: 类型参数语法
- PEP 698: 静态类型化的覆盖装饰器
弃用
- PEP 623: 移除Unicode中的wstr
- PEP 632: 移除distutils包
🌟新增
增强的f-string,双引号""
嵌套识别
f-string
早在3.6就引入的一种字符出格式化方法,也被称为格式化字符串常量,相比老式的格式化方法简洁很多。现在3.12版本中又增强了。
songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism']
# 3.11之前,因为多次使用了双引号导致f-string会报错,无法正确识别
print(f"This is the playlist: {", ".join(songs)}")
# 3.12之后就不会在报错,可以正常输出
print(f"This is the playlist: {', '.join(songs)}")
f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}"
新增override装饰器
@override在Java中出现过,这个装饰器的用途是当子类的方法想覆盖父类方法的默认实现时,可通过这个装饰器来表示,用来告诉编译器,这是一个被重写的方法,当子的该方法被调用时,不要再去调父类的方法了,现在Python也可以这么用了。
from typing import override
class Base:
def get_color(self) -> str: return "blue"
class GoodChild(Base):
@override # ok: overrides Base.get_color def get_color(self) -> str: return "yellow"class BadChild(Base): @override # type checker error: does not override Base.get_color def get_colour(self) -> str: return "red"
✴优化
提供了错误消息的可读性
在3.11及以前版本,如果模块没有导入时的错误提示时,只告诉你报错原因
# 3.11之前如果忘记导入一个模块
>>> sys.version_infoTraceback (most recent call last): File "<stdin>", line 1, in <module>NameError: name 'sys' is not defined
# 3.12
>>> sys.version_infoTraceback (most recent call last): File "<stdin>", line 1, in <module>NameError: name 'sys' is not defined. >>> Did you forget to import 'sys'? # 多了这一句提示