加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Python 3.8 究竟要不要升级?用过之后的小哥这样说

发布时间:2019-10-24 04:16:23 所属栏目:建站 来源:杨鲤萍
导读:本文转自雷锋网,如需转载请至雷锋网官网申请授权。 距 Python 3.8 稳定版正式发布已经过去了小半个月,不少 Python 常驻用户已经将 Python 更新到了 3.8 版本,也有一些朋友担心代码运行兼容性等问题,依然坚挺在 Python3.7 中。 那么,究竟要不要更新到

人们推荐的名字,比如'assignment operator'、'named expression operator'、'becomes operator'等等,而不是像 walrus operator 这样的行话,会导致混淆。

Python 3.8 究竟要不要升级?用过之后的小哥这样说

Python 3.8 究竟要不要升级?用过之后的小哥这样说

关于 walrus 运算符的争论

关于 walrus 运算符的详细介绍就是这些,除此之外,Python3.8 也有其它新功能——

仅位置参数(Positional-Only Arguments)

这是新增的一个函数形参语法,用来指明某些函数形参必须使用仅限位置而非关键字参数的形式。这种标记语法与通过 help() 所显示的使用 Larry Hastings 的 Argument Clinic 工具标记的 C 函数相同。

在下面的例子中,形参 a 和 b 为仅限位置形参,c 或 d 可以是位置形参或关键字形参,而 e 或 f 要求为关键字形参:

  1. def f(a, b, /, c, d, *, e, f): 
  2.  
  3.  print(a, b, c, d, e, f) 

以下均为合法的调用:

  1. f(10, 20, 30, d=40, e=50, f=60) 

但是,以下均为不合法的调用:

  1. f(10, b=20, c=30, d=40, e=50, f=60) # b cannot be a keyword argument 
  2.  
  3. f(10, 20, 30, 40, 50, f=60) # e must be a keyword argument 

这种标记形式的一个用例是它允许纯 Python 函数完整模拟现有的用 C 代码编写的函数的行为。另一个用例是在不需要形参名称时排除关键字参数。例如,内置的 len() 函数的签名为 len(obj, /)。

除了这一点,在 Python3.8 中,可以用 / 来表示必须通过仅位置参数之前的参数。这极大地方便了之前在自定义函数中,开发者没有简单的方法指定参数为仅位置参数的问题。

  1. def incr(x, /): 
  2.  
  3. return x + 1 

更多关于仅位置参数:https://www.python.org/dev/peps/pep-0570/

用于已编译字节码文件的并行文件系统缓存

新增的 PYTHONPYCACHEPREFIX 设置 (也可使用 -X pycache_prefix) 可将隐式的字节码缓存配置为使用单独的并行文件系统树,而不是默认的每个源代码目录下的 __pycache__ 子目录。

缓存的位置会在 sys.pycache_prefix 中报告 (None 表示默认位置即 __pycache__ 子目录)。

更详细内容:https://bugs.python.org/issue33499

调试构建使用与发布构建相同的 ABI

不管是在发布模式还是调试模式下构建,Python 现在都使用相同的 ABI。在   Unix 上,当 Python 以调试模式构建时,现在可以加载以发布模式构建的 C  扩展和使用稳定 ABI 构建的 C 扩展

更详细内容:https://bugs.python.org/issue36721

f 字符串支持一个方便的 = 说明符进行调试

=在 f-string 中添加了一个说明符。f 字符串(例如)f'{expr=}' 将扩展为表达式的文本、等号,然后扩展为求值表达式的表示形式。

更详细内容:https://bugs.python.org/issue36817

PEP 587:Python 初始化配置

在 PEP 587 添加了新的 C API 以配置 Python 初始化,从而提供了对整个配置的更好控制和更好的错误报告。

新的结构:

  • PyConfig

  • PyPreConfig

  • PyStatus

  • PyWideStringList

新的函数:

  • PyConfig_Clear()

  • PyConfig_InitIsolatedConfig()

  • PyConfig_InitPythonConfig()

  • PyConfig_Read()

  • PyConfig_SetArgv()

  • PyConfig_SetBytesArgv()

  • PyConfig_SetBytesString()

  • PyConfig_SetString()

  • PyPreConfig_InitIsolatedConfig()

  • PyPreConfig_InitPythonConfig()

  • PyStatus_Error()

  • PyStatus_Exception()

  • PyStatus_Exit()

  • PyStatus_IsError()

  • PyStatus_IsExit()

  • PyStatus_NoMemory()

  • PyStatus_Ok()

  • PyWideStringList_Append()

  • PyWideStringList_Insert()

  • Py_BytesMain()

  • Py_ExitStatusException()

  • Py_InitializeFromConfig()

  • Py_PreInitialize()

  • Py_PreInitializeFromArgs()

  • Py_PreInitializeFromBytesArgs()

  • Py_RunMain()

更详细内容:https://www.python.org/dev/peps/pep-0587/

Vectorcall: 用于 CPython 的快速调用协议

添加 "vectorcall" 协议到 Python/C API。它的目标是对已被应用于许多类的现有优化进行正式化。任何实现可调用对象的扩展类型均可使用此协议。

更详细内容:https://www.python.org/dev/peps/pep-0590/

具有外部数据缓冲区的 pickle 协议 5

当使用 pickle 在 Python 进程间传输大量数据以充分发挥多核或多机处理的优势时,非常重要一点是通过减少内存拷贝来优化传输效率,并可能应用一些定制技巧例如针对特定数据的压缩。

pickle 协议 5 引入了对于外部缓冲区的支持,这样 PEP 3118 兼容的数据可以与主 pickle 流分开进行传输,这是由通信层来确定的。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读