Python 3.10正式版发布
Python在几天前发布了正式版3.10,虽然你不一定会马上应用到生产环境,不过还是建议有条件的可以升级体验以下,没条件直接看我这篇文章就可以了,我列了几个开发者可能比较感兴趣的特性,看看哪个是你最期待的特性。
1、更友好的错误提示
expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6,
some_other_code = foo()
比如这段代码如果你不小心漏掉一个右花括号,运行代码时,在之前的版本中直接提示语法错误:
File "example.py", line 3
some_other_code = foo()
^
SyntaxError: invalid syntax
不仔细检查代码你还真的没法一眼看出来到底哪里语法错误。而在python3.10中,提示变得非常友好而且具体, 直接告诉你 "{"没有关闭,这样定位错误就很快了。
File "example.py", line 1
expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
^
SyntaxError: '{' was never closed
类似地,还有推导式中如果忘记加圆括号时,之前一言不合直接提示语法错误
```
{x,y for x,y in zip('abcd', '1234')} File "
", line 1 {x,y for x,y in zip('abcd', '1234')} ^ SyntaxError: invalid syntax ```
而现在会告诉你,是不是忘记加圆括号了。
```
{x,y for x,y in zip('abcd', '1234')} File "
", line 1 {x,y for x,y in zip('abcd', '1234')} ^ SyntaxError: did you forget parentheses around the comprehension target? ```
嗯,这才人性化。
2、match ... case 终于来了
match ... case 语法是我比较期待的功能,它不是什么多高级的功能,类似于其它语言中的 switch ... case 语法,在多条件判断时比用 if ... elif 代码更简洁。很难想象,这个语法现在才加进来,当然, 一开始Python之父是不愿意加这个语法特性的,好在这个语法最终还是回归了,而且换了个名字。
我在想,干嘛和自己过不去,统一都叫 switch ... case 不好吗?也许这就是Python让人着迷的地方吧。
来看个例子
这是用3.10的 match case 语法
def http_error(status):
match status:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
case _:
return "Something's wrong with the internet"
case _
类似于其它语言中的 default ,当其他条件都不符合就执行这行。
用普通的if ... else 语法来写
def http_error(status):
if status == 400:
return "Bad request"
elif status == 404:
return "Not found"
elif status == 418:
return "I'm a teapot"
else:
return "Something's wrong with the internet"
3、支持括号的上下文管理器
在之前的老版本中,多个上下文管理器必须放在一行或者用转义符“\”换行
``` with open("xxx.py", mode="w") as f1, open("yyy.py", mode="w") as f2: pass
或者
with open("xxx.py", mode="w") as f1, \ open("yyy.py", mode="w") as f2: pass ```
在3.10中,我们可以用括号将多个管理器放在多行,这样代码看起来整洁一些。
with (
open("xxx.py", mode="w") as f1,
open("yyy.py", mode="w") as f2
):
pass
4、新的类型联合操作符
在之前版本中,对于函数参数如果希望类型支持多种,例如同时支持int和float,需要用Union:
``` from typing import Union
def foo(number: Union[ int, float]) -> Union[int, float]: return number ** 2 ```
现在有个新的语法糖“|”,叫联合操作符,可以让代码更简洁
def square(number: int | float) -> int | float:
return number ** 2
该操作符在函数 isinstance()
和 issubclass()
也可以支持
```
python3.10
isinstance(1, int | str) True
python3.7
isinstance(1, (int,float)) True ```
最后
当开发者问到Python是否还会有Python4.0的时候,Python之父直言不要对 Python 4.0 抱有希望。假如真的哪天发布了Python4.0,也不会重走2.x过度到3.0的老路。同时,我们也别指望Python的GIL能够去掉,不是没尝试过,而是去掉GIL之后更慢了。如果你的项目对性能非常敏感,不妨试试pypy,python的一个分支。
本文同步发表博客:foofish.net
欢迎关注公众号