因为微信公众号文章有20000字数的限制,本文仅节选部分,查看全部译文请进入:
知乎专栏:
Python中文社区
或
PyCN技术评论
(点击阅读原文即可进入,网址:https://pycntech.github.io/)
原文:
What’s New In Python 3.6
翻译团队:
Py字幕组
首发刊物:
PyCN技术评论
(点击菜单栏:社区-刊物进入)
Github:
https://github.com/PyCN/PTR
由阿橙(
@sinoandywong
)召集,Ele(
@ictar
)、苍冥(
@eastrd
)组织翻译。
译者:
eastrd
:苍冥
ictar
:Ele
linchart
szthanatos
alex-marmot
heyuanree
sinoandywong
:阿橙
sxqs-yang
:若木羊
zilongcc
:水手
bubuyo
:铲屎官
yifan1024
YoungZiyi
fuckexception
Lving
LoveSn0w
phdhorse41
特别感谢:
Ele(
@ictar
):她为本文档的翻译做了大量工作,一个热爱美食的菇凉。
Py字幕组
:一个各路大(dou)神(bi)聚集的团队。
感谢他们所作出的工作,圣诞快乐!
2016.12.25
版本:
|
3.6.0
|
日期:
|
December 15, 2016
|
编辑:
|
Elvis Pranskevichus
,Yury Selivanov
|
这篇文章介绍了与3.5相比, Python 3.6中多出的新特性。
另请参阅
PEP 494
- Python 3.6 发布时间表
摘要 - 发布亮点
新的语法特性:
-
PEP 498, 格式化字符串字面量
-
PEP 515, 数字字面量中的下划线
-
PEP 526, 变量注解中的语法
-
PEP 525, 异步生成器
-
PEP 520: 异步解析式
新的库模块
CPython实现的改进:
-
重新实现了
字典(dict)
类型,以便能像
PyPy的字典类型
一样使用更紧凑的表达方式。与Python 3.5相比,这使字典的内存用量减少了20%到25%。
-
用新协定优化了类的自定义建立。
-
类属性定义顺序(class attribute definition order)现在被保留了
-
**kwargs内的元素顺序现在对应于将关键字(保留字)参数传递给函数的顺序
-
新增了对DTrace和SystemTap probing的支持。
-
新PYTHONMALLOC环境变量现在可用于调试解释器内存分配与访问错误。
标准库的重大改进:
-
为
asyncio
模块开发了新功能、显著的可用性、性能优化,以及大量的错误修复。 从Python 3.6开始,asyncio模块不再是临时的了,其API也进入了稳定状态。
-
实现了用于支持
类路径对象(path-like objects)
的新文件系统路径协议。 所有在路径(path)上使用的标准库函数都已更新,以便适应于新协议。
-
datetime
模块已获得对本地时间消歧(Local Time Disambiguation)的支持。
-
针对
typing
模块的一些改进,使其不再是临时模块。
-
tracemalloc
模块已重大改进,现用于为ResourceWarning提供更好的输出,并为内存分配错误提供更好的诊断。 欲知详情,请参阅PYTHONMALLOC部分。
安全相关的改进:
-
新
secrets模块
被用于简化那些适用于管理密文的密码学安全伪随机数生成器(cryptographically strong pseudo-random numbers)的生成过程,如认证、token等。
-
在Linux上,现将
os.urandom()
改成了阻塞模式,直到系统的urandom的熵池(entropy pool)的初始化具有更高的安全性。 解释请参见
PEP 524
。
-
hashlib
和
ssl
模块现已支持OpenSSL 1.1.0。
-
改进了
ssl模块
的默认设置和特性集。
-
新增了
hashlib模块
对BLAKE2、SHA-3、SHAKE哈希算法以及
scrypt()
密钥导出函数的支持。
Windows上的改进:
-
PEP 528与PEP 529,Windows文件系统和控制台的编码已更改为UTF-8。
-
当用户没有指定版本(通过命令行参数或配置文件)时,py.exe启动器以交互方式使用时,不再以Python 2优先于Python 3。 处理shebang行的方式保持不变 - 此处的“python”依旧指Python 2。
-
python.exe和pythonw.exe已标记为长路径敏感(long-path aware),这意味着260字符路径限制可能不再适用。 有关详细信息,请参阅
删除MAX_PATH限制
。
-
可以添加
._pth
文件以强制隔离模式(isolated mode)并完全指定所有搜索路径,以避免注册表查找和环境查找。 有关详细信息,请参阅
文档
。
-
一个python36.zip文件现可用作一个地标(landmark)以臆指
PYTHONHOME
。 有关详细信息,请参阅
文档
。
新特性
PEP 498: 格式化字符串
PEP 498
引入了一种新的字符串:_f-strings_, 或者
格式化字符串
。
格式化字符串带
'f'
前缀,类似于
str.format()
接受的格式字符串。它们包含了由花括号括起来的替换字段。替换字段是表达式,它们会在运行时计算,然后使用
format()
协议进行格式化:
>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}" # nested fields
'result: 12.35'
又见
PEP 498
- 字符串插值。
PEP由Eric V. Smith编写和实现。
特性文档
。
PEP 526: 变量注释语法
PEP 484
引入了函数参数的类型注释的标准,又名类型提示。这个PEP添加了用来注释变量(包括类变量和实例变量)类型的语法:
primes: List[int] = []
captain: str # Note: no initial value!
class Starship:
stats: Dict[str, int] = {}
正如函数注释,Python解释器不附加任何特殊意义到变量注释上,只是将它们存储在一个类或者模块的
__annotations__
属性中。
与静态类型语言中的变量声明相比,注释语法的目的在于提供一种简单的方式,通过抽象语法树和
__annotations__
属性,来为第三方工具和库指定结构化类型元数据。
又见
PEP 526
- 变量注释语法。
PEP由Ryan Gonzalez, Philip House, Ivan Levkivskyi, Lisa Roach, 和Guido van Rossum编写。由Ivan Levkivskyi实现。
使用或将要使用这个新语法的工具:
mypy
,
pytype
, PyCharm等等。
PEP 515: 数值文字中的下划线
PEP 515
添加了在数值文字中使用下划线的能力,以提高可读性。例如:
>>> 1_000_000_000_000_000
1000000000000000
>>> 0x_FF_FF_FF_FF
4294967295
数字之间和任何基本符号之后允许单个下划线。不允许前置、后置或者多个连续的下划线。
字符串格式化
语言现在还支持
'_'
选项,该选项用来通知对浮点表示类型和整型表示类型
'd'
,会把下划线当成千位分隔符使用。对于整型表示类型
'b'
,
'o'
,
'x'
, 和
'X'
, 下划线将会被插入到每4个数字之间:
>>> '{:_}'.format(1000000)
'1_000_000'
>>> '{:_x}'.format(0xFFFFFFFF)
'ffff_ffff'
又见
PEP 515
- 数值文字中的下划线
PEP由Georg Brandl和Serhiy Storchaka编写。
PEP 525: 异步生成器
PEP 492
引入支持原生协程和
async
/
await
的语法到Python 3.5。 在Python 3.5实现里的一个值得注意的
局限性就在于它不可能使用
await
和`yield'在同一个函数体中。 而在Python 3.6中,这个限制
已解除,这使得定义
异步生成器
成为可能:
async def ticker(delay, to):
"""Yield numbers from 0 to *to* every *delay* seconds."""
for i in range(to):
yield i
await asyncio.sleep(delay)
新的语法允许更快更简洁的代码。
参见
PEP 525
- 异步生成器
由Yury Selivanov撰写并实现的PEP。
PEP 530: 异步解析式
PEP 530
添加了对
async for
在list、set、dict解析式以及generator表达式中的使用支持:
result = [i async for i in aiter() if i % 2]
此外,所有解析式都支持“await”表达式:
result = [await fun() for fun in funcs if await condition()]
参见
PEP 530
- 异步解析式
由Yury Selivanov撰写并实现的PEP。
PEP 487: 用于建立类的更简单的自定义
现在可以在不使用元类的情况下自定义子类。每当创建一个新的子类时,新的
__init_subclass__
类方法将在基类上被调用,:
class PluginBase:
subclasses = []
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
cls
.subclasses.append(cls)
class Plugin1(PluginBase):
pass
class Plugin2(PluginBase):
pass
为了允许零参数
super()
从
_init_subclass __()
实现中被正确的调用并工作,自定义元类必须确保新的
__classcell__
命名空间输入传递到
type .__ new__
(如
创建类对象
)
参见
PEP 487
- 用于建立类的更简单的自定义
由Martin Teichmann撰写并实现的PEP。
功能文档
PEP 487: 描述符协议增强
PEP 487
扩展描述符协议必须包括新的可选的
__set_name __()
方法。 每当定义一个新类时,新方法将会调用定义中所有的描述符,并给它们提供定义类的引用,以及类命名空间中给予描述符的名字。 换句话说,描述符的实例现在可以获知所有者类的属性名:
class IntField:
def __get__(self, instance,