转眼间Python3.12已经发布两个月了,是在5月,那时候学业繁忙加上做各种课设和三级项目就没有第一时间体验到Python3.12,今天闲来无事去Python官网看看发现Python3.12已经发布第四个测试版了,于是我在今天将这个版本下载了下来,并参照Python的官方文档体验了Python3.12的几个新功能。
改进的错误信息
在使用未定义的标识符时,若此标识符为标准库中的模块名,则解释器会提示用户是否忘记导入此模块。
python 代码:>>> sys.version_info
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'sys' is not defined. Did you forget to import 'sys'?
实际使用
Python3.11:

Python3.12:

但是在如今集成开发环境下,实时代码检查功能也会提示这一错误,因此这个错误的提示可以说是很少用到。
改进的错误信息包含实例错误。如一个类具有一个属性,而该类的成员函数中使用了一个未定义的标识符,而这个标识符和该属性名称完全一致,则解释器会提示用户是否忘记引用该属性。
python 代码:>>> class A:
... def __init__(self):
... self.blech = 1
...
... def foo(self):
... somethin = blech
...
>>> A().foo()
File "<stdin>", line 1
somethin = blech
^^^^^
NameError: name 'blech' is not defined. Did you mean: 'self.blech'?
实际使用
Python3.12:

Python3.11:

Python3.11这个错误提示很有趣,竟然提示的是False,可见对于属性的错误提示Python3.12优化得不错。
最后一个错误提示就是导入提示,来看下面的一个搞笑例子。
python 代码:import a.y.z from b.y.z
File "<stdin>", line 1
import a.y.z from b.y.z
^^^^^^^^^^^^^^^^^^^^^^^
SyntaxError: Did you mean to use 'from ... import ...' instead?
但是这种低级错误一般不会犯吧(但是有些Python初学者可能受到其他编程语言的影响会这样写)。
还有一个导入提示就是拼写错误。
python 代码:from collections import chainmap
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name 'chainmap' from 'collections'. Did you mean: 'ChainMap'?
这种属于大小写拼写错误。但是实际上这些错误IDE都会提醒,但是Python解释器的这种功能不能没有,也算是给这门强大的语言锦上添花了。
f-string的语法形式化
现在f-string可以在格式化的大括号中使用和该字符串一致的引号了。
python 代码:>>> songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism']
>>> f"This is the playlist: {", ".join(songs)}"
'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
实际效果

值得注意的是这段代码在解释器为Python3.12的PyCharm中仍会报错。

而Python3.11中运行也会提示这个错误。

现在f-string也可以将花括号分开多行来写,以提高可读性。
python 代码:>>> f"This is the playlist: {", ".join([
... 'Take me back to Eden', # My, my, those eyes like fire
... 'Alkaline', # Not acid nor alkaline
... 'Ascensionism' # Take to the broken skies at last
... ])}"
'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
实际效果

这个我感觉还是比较实用的,尤其是像我这样喜欢f-string又为程序可读性而两者取舍的。
f-string中的错误提示
在Python3.11中,若f-string出现错误,Python会输出一整行的错误信息,而Python3.12中只会输出错误的表达式。
Python3.11中:
python 代码:>>> my_string = f"{x z y}" + f"{1 + 1}"
File "<stdin>", line 1
my_string = f"{x z y}" + f"{1 + 1}"
^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?
Python3.12中:
python 代码:>>> my_string = f"{x z y}" + f"{1 + 1}"
File "<stdin>", line 1
(x z y)
^^^
SyntaxError: f-string: invalid syntax. Perhaps you forgot a comma?
这个其实我感觉可有可无。
其他更新
根据PEP 623,删除了 unicode 对象的 C 实现的弃用wstr和成员。wstr_length
在该unittest模块中,删除了许多长期弃用的方法和类。(自 Python 3.1 或 3.2 以来,它们已被弃用)。
已弃用的smtpd和distutils模块已被删除(参见PEP 594和PEP 632。setuptools包(默认安装在 virtualenvs 和许多其他地方)继续提供模块distutils。
许多其他旧的、损坏的和弃用的函数、类和方法已被删除。
字符串中无效的反斜杠转义序列现在用SyntaxWarning而不是警告DeprecationWarning,使它们更明显。(它们将来会成为语法错误。)
整数的内部表示已更改以准备性能增强。(这应该不会影响大多数用户,因为它是一个内部细节,但它可能会导致 Cython 生成的代码出现问题。
对于此次更新我就看到这里,更多请移步《Python 3.12 中的新功能》查看。
又出新版本啦!
对,Python3.12在10月份就发布正式版了,虽然更新了些寂寞,但是最新版本的Python不能没有。
暂无点赞
暂无点赞