python最新版本3.10特性⼤全
全⽂3000字,预计阅读时间20min,建议先赞后看!
⼀.上下⽂管理器
python3.10 中,with ⽀持使⽤外层圆括号来使⽤多个上下⽂管理器,可以连续多⾏地书写。这允许将过长的上下⽂管理器集能够以与之前 import 语句类似的⽅式格式化为多⾏的形式。例如,以下这些⽰例写法现在都是有效的:
with (CtxManager() as example):
pass
with (
CtxManager1(),
CtxManager2()
):
pass
with (CtxManager1() as example,
CtxManager2()):
pass
with (CtxManager1(),
CtxManager2() as example):
pass
with (
CtxManager1() as example1,
CtxManager2() as example2
):
pass
⼆.新增结构化模式匹配
python3.10 中新增的结构化模式匹配,主要由 match、case 两个关键字实现,模式匹配的通⽤语法如下
status = 404
match status:
case 400:
res = "Bad request"
case 404:
res = "Not found"
case 418:
res = "I'm a teapot"
case _:
res = "Something's wrong with the internet"
match 语句接受⼀个表达式并将其值与以⼀个或多个 case 语句块形式给出的⼀系列模式进⾏⽐较。具体来说,模式匹配的操作如下:
python新手代码大全pdf使⽤具有特定类型和形状的数据 (subject) 针对 subject 在 match 语句中求值 从上到下对 subject 与 case 语句中的每个模式进⾏⽐较直到确认匹配到⼀个模式。 执⾏与被确认匹配的模式相关联的动作。 如果没有确认到⼀个完全的匹配,则如果提供了使⽤通配符_ 的最后⼀个 case 语句,则它将被⽤作已匹配模式。如果没有确认到⼀个完全的匹配并且不存在使⽤通配符的 case 语句,则整个match 代码块不执⾏任何操作。
三.新的类型联合运算符
python3.10 中引⼊了启⽤ X | Y 语法的类型联合运算符。这提供了⼀种表⽰ '类型 X 或类型 Y' 的相⽐使⽤ typing.Union 更清晰的⽅式,特别是在类型提⽰中。在之前的 Python 版本中,要为可接受多种类型参数的函数应⽤类型提⽰。
def square(number: Union[int, float]) -> Union[int, float]:
return number ** 2
类型提⽰现在可以使⽤更简洁的写法:
def square(number: int | float) -> int | float:
return number ** 2
这个新增语法也被接受作为 isinstance() 和 issubclass() 的第⼆个参数:
>>> isinstance(1, int | str)
True
四.类型别名
python3.10 中 引⼊了类型别名的概念,只要求它们是不带标注的最⾼层级赋值。这种简单性有时会使得类型检查器难以区分类型别名和普通赋值,特别是当涉及到前向引⽤或⽆效类型的时候。
例如在⽐较:
StrCache = 'Cache[str]' # a type alias
LOG_PREFIX = 'LOG[DEBUG]' # a module constant
现在 typing 模块具有⼀个特殊值 TypeAlias 可让你更明确地声明类型别名:
StrCache: TypeAlias = 'Cache[str]' # a type alias
LOG_PREFIX = 'LOG[DEBUG]' # a module constant
04.错误信息更详细
在 python3.10 之前代码中的语法错误,⼤都错误提⽰信息都不精准,在 python3.10 中做了更多的优化处理
4.1、缺少括号的错误提⽰更完善
在 3.10 之代码如果你写的代码中缺少⼀个括号,运⾏代码抛出的错误信息中并不会准备的提⽰你哪个位置缺少括号,⽽是抛出⼀个不准确的错误信息。如下
a = {9: 1, 18: 2, 19: 2
b = 100
python3.10 之前:
File "demo.py", line 3
b = 100
^
SyntaxError: invalid syntax
但在 Python 3.10 中则提⽰更准确的错误信息:
python3.10:
File "demo.py", line 1
a = {9: 1, 18: 2, 19: 2
^
SyntaxError: '{' was never closed
4.2、语法错误的代码⾼亮标识
3.10 之前的语法错误显⽰
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^
SyntaxError: Generator expression must be parenthesized
3.10 的语法错误显⽰
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^^^^^^^^^^^^^^^^^^^^
SyntaxError: Generator expression must be parenthesized
五、更多详细的错误提⽰场景
代码块之前缺失 :
>>> if rocket.position > event_horizon
File "<stdin>", line 1
if rocket.position > event_horizon
^
SyntaxError: expected ':'
5.1在多项集字⾯值中和表达式之间缺失逗号::
>>> items = {x: 1,y: 2 z: 3}
File "<stdin>", line 3
y: 2
^
SyntaxError: invalid syntax. Perhaps you forgot a comma?
多个异常类型捕获时不带圆括号:
>>> try:
... build_dyson_sphere()
... except NotEnoughScienceError, NotEnoughResourcesError:
File "<stdin>", line 3
except NotEnoughScienceError, NotEnoughResourcesError:
^
SyntaxError: multiple exception types must be parenthesized
字典字⾯值中缺失 : 和值:
>>> values = {x: 1,y: 2,z:}
File "<stdin>", line 4
z:
^
SyntaxError: expression expected after dictionary key and ':'
>>> values = {x:1, y:2, z w:3}
File "<stdin>", line 1
values = {x:1, y:2, z w:3}
^
SyntaxError: ':' expected after dictionary key
在⽐较中使⽤ = ⽽不是 ==:
>>> if rocket.position = event_horizon:
File "<stdin>", line 1
if rocket.position = event_horizon:
^
SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='?
try 代码块不带 except 或 finally 代码块:
>>> try:
... x = 2
... something = 3
File "<stdin>", line 3
something = 3
^^^^^^^^^
SyntaxError: expected 'except' or 'finally' block
5.2、IndentationError
代码缩进异常的意识更完善,会明确提⽰需要缩进的语句,包括语句的位置:
>>> def foo():
... if lel:
... x = 2
File "<stdin>", line 3
x = 2
^
IndentationError: expected an indented block after 'if' statement in line 2
5.3、AttributeError
当打印 AttributeError 时,将提供引发异常的对象中类似属性名称的建议:
>>> collections.namedtoplo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple?
5.4、NameError
NameError 的错误信息中将提供引发异常的函数中类似变量名称的建议
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论