Python3.11正式版发布已经好几天了,刚好今天瞅了一下,写了几个例子,捡几个比较实用的特性说说
更友好的异常提示 直接看例子:
def main () : x = {"a" : 1 } x['a' ]['b' ]['c' ]['d' ] = 1 if __name__ == "__main__" : main() 假设x是通过调用第三方API拿回来的数据,a、b、c、d这些key本以为都是存在的key,运行:
上面是python3.10及更早版本抛出的异常,subscriptable 指下标的意思,这的意思是说 int 对象没有下标,只有字典和列表这样的对象才有。看错误日志很难定位到底是哪个int对象不能subscriptable。你要挨个去调试才知道。
Python3.11版本给出了更人性化的错误提示, ^^^ 标记的位置就是真正报错的地方。
另外, BaseException 还添加了一个 add_note() 方法,我们可以在捕获异常时加入一些附加信息方便后续的bug定位。
def main () -> None : try : raise TypeError("bad type" ) except TypeError as e: e.add_note("这是一段附加信息" ) logging.exception(e)
支持TOML格式文件解析 TOML是一种比YAML更清晰的配置文件格式,现在Python3.11直接内置了标准库来解析TOML文件。
import pprintimport tomllibwith open("test.toml" , "rb" ) as f: data = tomllib.load(f) pprint.pprint(data)toml文件
a = "a" b = "b" c.x = "c.x" c.y = "c.y" [d] x = "d.x" y = "d.y" [[e]] x = "e[0].x" y = "e[0].y" [[e]] x = "e[1].x" y = "e[1].y" [f.A] x.y = "f.A.x.y" [f.B] x.y = """ f. B. x. y """ [f.C] points = [ { x=1, y=1, z=0 }, { x=2, y=4, z=0 }, { x=3, y=9, z=0 }, ] 解析出来的字典对象是:
更丰富的类型提示 新增 Self 类型
以前在类中定义一个方法如果要声明返回值是类本身的实例,要写成类的字符串形式,哪天要是给这个类重命名,这个字符串也得跟着改。Python3.11新增了Self 后方便不少。
新增字符串枚举StrEnum
python3.10前定义一个字符串枚举时,只能继承Enum类,现在可以直接继承 StrEnum 类了,它是字符串 str 的子类。所以枚举值也是个字符串, 现在可以直接用枚举值与字符串做比较,而不需要像3.10一样先获取 value
性能提升 性能方面,python3.11对解释器做了不少优化,整体性能比3.10提高了10~60%。这要归功于一个叫 Faster CPython的项目,Faster CPython 是一个由微软赞助,Python 之父 Guido van Rossum、微软高级软件工程师 Eric Snow 和 Mark Shannon 共同负责该项目。可以预计未来Python还会更快。