白衣苍狗

天上浮云似白衣,斯须改变如苍狗

0%

Python3.10新特性

Python每个版本都会或多或少新增一些新特性,虽然要一直跟着新版本走是不太可能的,但是一些新特性还是很有用的,比如类型注解,f-format等等特性都是慢慢加进来的。这里简单记录下3.10感兴趣的新特性,省得老是查来查去。

Python3.10发布于2021-10-04。本文都是参考官方文档Python 3.10 有什么新变化

圆括号管理器

Python使用缩进标记语法,因此是不能随便换行的,但是有时候一行写的实在是臃肿,现在可以使用类似下面这样的语法来让一行的结构更直观易读了

1
2
3
4
5
with (
CtxManager1(),
CtxManager2()
):
pass

更清楚的错误信息

现在Python解释器也能更清楚地标记括号导致的语法错误产生的位置了,更多的异常消息,更详细的提示,错误名称建议等等。

Python有时候的错误信息确实相当迷惑)。

结构化模式匹配(switch)

Python终于有“switch”语法了,当然他们自己叫做模式匹配。

模式匹配的语法如下

1
2
3
4
5
6
7
8
9
match subject:
case <pattern_1>:
<action_1>
case <pattern_2>:
<action_2>
case <pattern_3>:
<action_3>
case _:
<action_wildcard>
  • 只会进入匹配到的模式,后续不会执行。所以也不需要break。

  • 和C中的switch结构比较像,需要注意的是_类似default。

  • case中可以使用|组合多个值,如

    1
    2
    case 401 | 403 | 404:
    return "Not allowed"
  • 如果有多个case匹配,只会进入第一个匹配到的case。

  • case中可以对match传入的变量解包。

  • match也可以传入一个类。

  • case可以嵌套,如case [Point(0, 0)]

  • 通配符_其实可以使用在case任意位置,如

    1
    2
    case ('error', code, _):
    print(f"An error {code} occurred.")
  • 模式还可以添加一个if约束项,如

    1
    2
    case Point(x, y) if x == y:
    print(f"The point is located on the diagonal Y=X at {x}.")

基本语法就是这些。

类型提示的新特性

自从Python引入了类型注解之后,很多很多事情变得更方便了。3.10带来了更多的类型提示的特性。

  • 联合类型运算符|

    可以使用该运算符表示多种类型了,如

    1
    2
    def square(number: int | float) -> int | float:
    return number ** 2

    可以表示intfloat类型。

  • 显示的类型别名

    虽然原来类型标注也是使用类型别名,但是很容易和普通的赋值混淆,现在可以使用typing模块中的TypeAlias显示地声明类型别名了,如

    1
    2
    StrCache: TypeAlias = 'Cache[str]'  # a type alias
    LOG_PREFIX = 'LOG[DEBUG]' # a module constant

新的类型联合运算符PEP604

显示类型别名PEP613

比较有趣的Python3.10新增特性基本上就这些了。