Skip to main content

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'? # 多了这一句提示

🗑弃用

参阅资料