Python 3.6 有什么新�化¶
- 编者:
Elvis Pranskevichus <elvis@magic.io>, Yury Selivanov <yury@magic.io>
本文解释了与3.5相比,Python 3.6ä¸çš„æ–°åŠŸèƒ½ã€‚ Python 3.6于2016å¹´12月23æ—¥å�‘布。请å�‚阅 changelog 以获å�–完整的更改列表。
��
PEP 494 - Python 3.6 �布计划
摘� -- �布�点¶
æ–°çš„è¯æ³•特性:
PEP 498, æ ¼å¼�化å—符串å—é�¢å€¼
PEP 515, æ•°å—å—é�¢å€¼ä¸çš„下划线。
PEP 526 , å�˜é‡�æ ‡æ³¨è¯æ³•。
PEP 525,异æ¥ç”Ÿæˆ�器。
PEP 530: å¼‚æ¥æŽ¨å¯¼å¼�。
新的库模�:
CPython 实现的改进:
æ ¹æ�® Raymond Hettinger çš„æ��è®® 已将 dict 类型é‡�新实现为使用 更紧凑的表示形å¼� 并类似于 PyPy dict implementation。 这使得å—典所使用的内å˜ç›¸å¯¹äºŽ Python 3.5 版å‡�少了 20% 到 25%。
类创建的定制过程通过 新�议 得到了简化。
类属性的定义顺� 现在会被�留。
现在
**kwargsä¸çš„å…ƒç´ ä¼šä¸Žä¼ ç»™å‡½æ•°çš„å…³é”®å—å�‚æ•° ä¿�æŒ�对应顺åº�ã€‚æ·»åŠ äº† DTrace å’Œ SystemTap 探测支æŒ�
æ–°çš„ PYTHONMALLOC 环境å�˜é‡�å�¯è¢«ç”¨æ�¥è°ƒè¯•解释器的内å˜åˆ†é…�和访问错误。
æ ‡å‡†åº“ä¸çš„é‡�大改进:
asyncio模å�—获得了许多新特性,显著的å�¯ç”¨æ€§å’Œæ€§èƒ½æ��å�‡ï¼Œä»¥å�Šå¤§é‡�的问题修æ£ã€‚ 从 Python 3.6 开始asyncio模å�—ä¸�å†�处于待定状æ€�,它已被视为稳定 API。实现了新的 文件系统路径å��è®® 以支æŒ� 路径类对象。 所有æ“�ä½œè·¯å¾„çš„æ ‡å‡†åº“å‡½æ•°å·²è¢«æ›´æ–°ä¸ºä½¿ç”¨æ–°çš„å��议。
datetime模å�—已获得对 本地时间消æ§ä¹‰ 的支æŒ�。tracemalloc模å�—已被大幅é‡�写,现在将被用于为ResourceWarningæ��供更好的输出,并为内å˜åˆ†é…�错误æ��供更好的诊æ–。 请å�‚阅 PYTHONMALLOC 一节 æ�¥äº†è§£è¯¦æƒ…。
安全改进:
æ·»åŠ äº†
secrets模å�—以简化适用于密ç �管ç�†çš„é«˜åŠ å¯†å¼ºåº¦ä¼ªéš�机数的生æˆ�,例如账户验è¯�ã€�安免凿�®ç‰åœºæ™¯ã€‚在 Linux 上,现在
os.urandom()会阻塞直到系统的 urandom ç†µæ± è¢«åˆ�始化以æ��å�‡å®‰å…¨æ€§ã€‚ å…¶ç�†ç”±å�‚è§� PEP 524。ssl模å�—的默认设置和特性集已得到改进。hashlib模å�—获得了对 BLAKE2, SHA-3 å’Œ SHAKE 哈希算法以å�Šscrypt()密钥派生函数的支æŒ�。
Windows改进:
PEP 528 å’Œ PEP 529, å°†Windows文件系统和控制å�°çš„ç¼–ç �更改为UTF-8
在交互�地使用
py.exeå�¯åŠ¨å™¨æ—¶ï¼Œå½“ç”¨æˆ·æœªï¼ˆé€šè¿‡å‘½ä»¤è¡Œå�‚数或é…�置文件)指定版本时ä¸�å†�优先选择 Python 2 而是选择 Python 3。 对声明行的处ç�†åˆ™ä¿�æŒ�ä¸�å�˜ —— 在这ç§�情况下 "python" 还是指 Python 2。python.exeå’Œpythonw.exeå·²è¢«æ ‡è®°ä¸ºæ”¯æŒ�长路径,这æ„�味ç�€ä¸�å†�有 260 个å—符的路径长度é™�制。 详情å�‚è§� 移除 MAX_PATH é™�制。å�¯ä»¥æ·»åŠ ä¸€ä¸ª
._pth文件�强制使用隔离模�和完整指定所有�索路径���注册表和环境查找。 更多信�请�阅 相关文档。现在
python36.zip文件å�¯ä»¥ä½œä¸ºæŽ¨æ–PYTHONHOMEçš„æ ‡è®°ç‰©ã€‚ 请å�‚阅 相关文档 了解详情。
新的特性¶
PEP 498: æ ¼å¼�化å—符串å—é�¢å€¼Â¶
PEP 498 引入了一ç§�新型的å—符串å—é�¢å€¼: f-å—符串,或称 æ ¼å¼�化å—符串å—é�¢å€¼ã€‚
æ ¼å¼�化å—符串å—é�¢å€¼å¸¦æœ‰ '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 526: å�˜é‡�æ ‡æ³¨çš„è¯æ³•¶
PEP 484 引入了函数形å�‚ç±»åž‹æ ‡æ³¨å�³ç±»åž‹æ��ç¤ºçš„æ ‡å‡†ã€‚ 这个 PEP 为 Python æ·»åŠ äº†æ ‡æ³¨å�˜é‡�ç±»åž‹çš„è¯æ³•,包括类å�˜é‡�和实例å�˜é‡�:
primes: List[int] = []
captain: str # Note: no initial value!
class Starship:
stats: Dict[str, int] = {}
ä¸Žå‡½æ•°æ ‡æ³¨ä¸€æ ·ï¼ŒPython 解释器ä¸�会为å�˜é‡�æ ‡æ³¨é™„åŠ ä»»ä½•ç‰¹æ®Šå�«ä¹‰ï¼Œä»…会将其ä¿�å˜åœ¨ç±»æˆ–模å�—çš„ __annotations__ 属性ä¸ã€‚
与é�™æ€�ç±»åž‹è¯æ³•çš„å�˜é‡�声明ä¸�å�Œï¼Œæ ‡æ³¨è¯æ³•çš„ç›®çš„æ˜¯é€šè¿‡æŠ½è±¡è¯æ³•æ ‘å’Œ __annotations__ 属性æ��供一个简å�•æ–¹å¼�æ�¥ä¸ºç¬¬ä¸‰æ–¹å·¥å…·å’Œåº“指定结构化类型元数æ�®ã€‚
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 -- 异æ¥ç”Ÿæˆ�器
PEP 由 Yury Selivanov 撰写并实现
PEP 530: å¼‚æ¥æŽ¨å¯¼å¼�¶
PEP 530 æ·»åŠ äº†å¯¹åœ¨åˆ—è¡¨ã€�集å�ˆä¸Žå—典推导å¼�和生æˆ�器表达å¼�ä¸ä½¿ç”¨ async for 的支æŒ�:
result = [i async for i in aiter() if i % 2]
æ¤å¤–,await 表达å¼�也在所有ç§�类的推导å¼�ä¸å¾—到支æŒ�:
result = [await fun() for fun in funcs if await condition()]
��
- PEP 530 -- å¼‚æ¥æŽ¨å¯¼å¼�
PEP 由 Yury Selivanov 撰写并实现
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
为了让æ�¥è‡ª __init_subclass__() 实现的零å�‚æ•° super() 调用能æ£ç¡®å·¥ä½œï¼Œè‡ªå®šä¹‰å…ƒç±»å¿…é¡»ä¿�è¯�æ–°çš„ __classcell__ 命å��空间入å�£è¢«ä¼ æ’到 type.__new__ (如 创建类对象 䏿‰€æ��è¿°)。
��
- PEP 487 -- 更简�的自定义类创建
PEP 由 Martin Teichmann 撰写并实现。
PEP 487: �述器�议的增强¶
PEP 487 扩展了æ��述器å��议以包括新的å�¯é€‰æ–¹æ³• __set_name__()。 当创建一个新类时,这个新方法将在定义ä¸åŒ…括的所有æ��述器上被调用,为它们æ��供对所定义类的引用以å�Šåœ¨ç±»å‘½å��ä¸é—´ä¸ç»™äºˆæ��述器的å��称。 æ�¢å�¥è¯�说,æ��述器的实例现在能知é�“æ��述器在所有者类ä¸çš„属性å��ç§°:
class IntField:
def __get__(self, instance, owner):
return instance.__dict__[self.name]
def __set__(self, instance, value):
if not isinstance(value, int):
raise ValueError(f'expecting integer in {self.name}')
instance.__dict__[self.name] = value
# this is the new initializer:
def __set_name__(self, owner, name):
self.name = name
class Model:
int_field = IntField()
��
- PEP 487 -- 更简�的自定义类创建
PEP 由 Martin Teichmann 撰写并实现。
PEP 519: æ·»åŠ æ–‡ä»¶ç³»ç»Ÿè·¯å¾„å��议¶
文件系统路径历æ�¥è¢«è¡¨ç¤ºä¸º str 或 bytes 对象。 这使得编写对文件系统路径进行æ“�作的代ç �的人会å�‡å®šè¿™ç§�对象å�ªèƒ½æ˜¯è¿™ä¸¤ç§�类型之一(ä¸�考虑表示文件æ��述符的 int å› ä¸ºå®ƒä¸�是文件路径)。 ä¸�幸的是,这ç§�å�‡å®šé˜»æ¢äº†åƒ� pathlib è¿™æ ·çš„æ–‡ä»¶ç³»ç»Ÿè·¯å¾„çš„æ›¿ä»£å¯¹è±¡è¡¨ç¤ºå½¢å¼�与包括 Python æ ‡å‡†åº“åœ¨å†…çš„çŽ°æœ‰ä»£ç �å��å�Œå·¥ä½œã€‚
为了修æ£è¿™ç§�情况,一个由 os.PathLike 表示的新接å�£è¢«å®šä¹‰å‡ºæ�¥ã€‚ 通过实现 __fspath__() 方法,对象å�¯ä»¥è¡¨æ˜Žå®ƒä»£è¡¨ä¸€ä¸ªè·¯å¾„。 è¿™æ ·ä¸€ä¸ªå¯¹è±¡å°±èƒ½ä»¥ str 或 bytes 对象的形å¼�æ��供文件系统路径的低层级表示。 è¿™æ„�味ç�€å¦‚果一个对象实现了 os.PathLike 或者是表示文件系统路径的 str 或 bytes 对象它就会被当作是 路径型对象。 代ç �å�¯ä»¥ä½¿ç”¨ os.fspath()ã€�os.fsdecode() 或 os.fsencode() æ�¥æ˜¾å¼�地获å�–一个路径型对象的 str å’Œ/或 bytes 表示形å¼�。
内置 open() 函数已被更新为接å�— os.PathLike 对象,就åƒ� os å’Œ os.path 模å�—ä¸çš„æ‰€æœ‰ç›¸å…³å‡½æ•°å’Œæ ‡å‡†åº“ä¸çš„å¤§å¤šæ•°å…¶ä»–å‡½æ•°å’Œç±»ä¸€æ ·ã€‚ os.DirEntry 类和 pathlib ä¸çš„相关类也已被更新以实现 os.PathLike。
希望对于针对文件系统路径æ“�作的基本函数的更新将会使得第三方代ç �都能éš�å¼�地支æŒ�所有 路径型对象 è€Œæ— é¡»ä¿®æ”¹ä»»ä½•ä»£ç �,或者至少å�ªéœ€æž�少的修改(例如当对路径型对象进行æ“�作之å‰�在代ç �的开头调用 os.fspath() å�³å�¯ï¼‰ã€‚
下é�¢çš„这些示例说明了新的接å�£æ˜¯å¦‚何让 pathlib.Path 被更容易ã€�æ›´é€�明地用于已有代ç �çš„:
>>> import pathlib
>>> with open(pathlib.Path("README")) as f:
... contents = f.read()
...
>>> import os.path
>>> os.path.splitext(pathlib.Path("some_file.txt"))
('some_file', '.txt')
>>> os.path.join("/a/b", pathlib.Path("c"))
'/a/b/c'
>>> import os
>>> os.fspath(pathlib.Path("some_file.txt"))
'some_file.txt'
(由 Brett Cannon, Ethan Furman, Dusty Phillips 和 Jelle Zijlstra 实现。)
��
- PEP 519 -- æ·»åŠ æ–‡ä»¶ç³»ç»Ÿè·¯å¾„å��è®®
PEP 由 Brett Cannon 和 Koos Zevenhoven 撰写。
PEP 495: 消除本地时间的æ§ä¹‰Â¶
在世界上大多数地方,过去和将æ�¥éƒ½ä¼šå˜åœ¨æœ¬åœ°æ—¶é’Ÿå�Žç§»çš„æ—¶å€™ã€‚ 在这ç§�时候,本地时钟会在å�Œä¸€å¤©å†…两次显示相å�Œçš„æ—¶é—´ã€‚ 对于这些情况,本地时钟所显示的(或å˜å‚¨åœ¨ Python datetime 实例ä¸çš„)信æ�¯å°†ä¸�è¶³ä»¥æ ‡è¯†æŸ�个特定的时间点。
PEP 495 为 datetime.datetime å’Œ datetime.time ç±»çš„å®žä¾‹æ·»åŠ äº†æ–°çš„ fold 属性以在本地时间相å�Œçš„两个时间点之间进行区分:
>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
>>> for i in range(4):
... u = u0 + i*HOUR
... t = u.astimezone(Eastern)
... print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
...
04:00:00 UTC = 00:00:00 EDT 0
05:00:00 UTC = 01:00:00 EDT 0
06:00:00 UTC = 01:00:00 EST 1
07:00:00 UTC = 02:00:00 EST 0
fold 属性的值在大多数实例上å�‡ä¸º 0,å�ªæœ‰åœ¨ä»£è¡¨å˜åœ¨æ§ä¹‰çš„æ—¶é—´çš„第二个(按å�‘生顺åº�)实例上例外。
��
- PEP 495 -- 消除本地时间的æ§ä¹‰
PEP 由 Alexander Belopolsky 和 Tim Peters 撰写,由 Alexander Belopolsky 实现。
PEP 529: å°† Windows 文件系统编ç �æ ¼å¼�更改为 UTF-8¶
在表示文件系统路径时最好是使用 str (Unicode) 而ä¸�是 bytes。 ä¸�过,在æŸ�些情况下使用 bytes 就是足够而且æ£ç¡®çš„。
在 Python 3.6 之å‰�,在 Windows 上使用 bytes 路径值å�¯èƒ½ä¼šå¯¼è‡´æ•°æ�®ä¸¢å¤±ã€‚ 有了这一更改,现在 Windows 上将支æŒ�使用 bytes æ�¥è¡¨ç¤ºè·¯å¾„,å‰�æ��是这些 bytes 值是用 sys.getfilesystemencoding() 所返回的编ç �æ ¼å¼�æ�¥ç¼–ç �的,现在æ¤ç¼–ç �æ ¼å¼�默认为 'utf-8'。
ä¸�使用 str æ�¥è¡¨ç¤ºè·¯å¾„的应用程åº�应当使用 os.fsencode() å’Œ os.fsdecode() æ�¥ç¡®ä¿� bytes 被æ£ç¡®åœ°ç¼–ç �。 è¦�æ�¢å¤�以å‰�的行为,请设置 PYTHONLEGACYWINDOWSFSENCODING 或调用 sys._enablelegacywindowsfsencoding()。
有关详细信æ�¯å’Œå�¯èƒ½éœ€è¦�的代ç �修改的讨论,请å�‚è§� PEP 529 。
PEP 528: å°† Windows 控制å�°ç¼–ç �æ ¼å¼�更改为 UTF-8¶
现在,Windows 上的默认控制å�°å°†æŽ¥å�—所有 Unicode å—符并为 Python 代ç �æ��ä¾›æ£ç¡®è¯»å�–çš„ str 对象。sys.stdin, sys.stdout å’Œ sys.stderr 现在默认使用 utf-8 ç¼–ç �æ ¼å¼�。
æ¤æ›´æ”¹ä»…在使用交互å¼�控制å�°æ—¶é€‚用,而ä¸�适用于é‡�定å�‘文件或管é�“。 è¦�æ�¢å¤�以å‰�使用交互å¼�控制å�°æ—¶çš„行为,请设置 PYTHONLEGACYWINDOWSSTDIO。
��
- PEP 528 -- å°† Windows 控制å�°ç¼–ç �æ ¼å¼�更改为 UTF-8
PEP 由 Steve Dower 撰写并实现。
PEP 520: �留类属性定义顺�¶
类定义体ä¸çš„属性具有自然的排åº�:与å��称在æº�代ç �ä¸å‡ºçŽ°çš„é¡ºåº�相å�Œã€‚ çŽ°åœ¨æ¤æŽ’åº�会在新类的 __dict__ 属性ä¸è¢«ä¿�留。
并且,实际的默认类 execution 命å��空间 (从 type.__prepare__() 返回) 现在将是一个ä¿�ç•™æ�’入顺åº�çš„æ˜ å°„å¯¹è±¡ã€‚
��
- PEP 520 -- �留类属性定义顺�
PEP 由 Eric Snow 撰写并实现
PEP 468: ä¿�留关键å—å�‚数顺åº�¶
函数ç¾å��ä¸çš„ **kwargs 现在将ä¿�è¯�是一个ä¿�ç•™æ�’入顺åº�çš„æ˜ å°„å¯¹è±¡ã€‚
��
- PEP 468 -- ä¿�留关键å—å�‚数顺åº�
PEP 由 Eric Snow 撰写并实现
新的 dict 实现¶
dict 类型现在会使用一ç§�基于 Raymond Hettinger çš„æ��è®® 的“紧凑â€�表示形å¼�,该表示形å¼� 最åˆ�ç”± PyPy 实现。 æ–°çš„The memory usage of the new dict() 的内å˜å� 用相比 Python 3.5 å‡�少了 20% 到 25%。
这个新实现对原始顺åº�çš„ä¿�留被认为是一个实现细节而ä¸�应当被ä¾�赖(这在将æ�¥å�¯èƒ½ä¼šæ”¹å�˜ï¼Œä½†æˆ‘们希望在改å�˜è¯è¨€è§„范以强制所有当å‰�和将æ�¥çš„ Python 实现都使用ä¿�留顺åº�çš„è¯ä¹‰ä¹‹å‰�å…ˆåœ¨å‡ ä¸ªå�‘布版的è¯è¨€å†…部使用这个新的 dict 实现;这也有助于让ä»�在使用éš�机è¿ä»£é¡ºåº�的旧版本è¯è¨€ä¾‹å¦‚ Python 3.5 ä¿�æŒ�å�‘下兼容性)。
(由 INADA Naoki 在 bpo-27350 ä¸è´¡çŒ®ã€‚ 该特性 最åˆ�ç”± Raymond Hettinger æ��议。)
PEP 523: å�‘ CPython æ·»åŠ å¸§æ±‚å€¼ API¶
虽然 Python 为自定义代ç �执行方å¼�æ��供了广泛的支æŒ�ï¼Œä½†æœ‰ä¸€ä¸ªåœ°æ–¹å®ƒæ²¡æœ‰è¿™æ ·å�šï¼Œé‚£å°±æ˜¯å¸§å¯¹è±¡çš„æ±‚值。 如果您想在 Python 䏿‹¦æˆªå¸§çš„æ±‚值,那么确实没有除了直接æ“�纵自定义函数的函数指针以外的任何办法。
PEP 523 通过æ��供使帧求值在 C è¯è¨€å±‚级上å�¯æ�’入的 API 从而改å�˜äº†è¿™ä¸€çŠ¶å†µã€‚ 这将å…�许调试器和 JIT ç‰å·¥å…·åœ¨ Python 代ç �开始执行之å‰�拦截帧求值。 è¿™æ ·å°±èƒ½å…�许 Python 代ç �使用替代性求值实现,跟踪帧求值ç‰å�šæ³•ã€‚
这个 API å¹¶ä¸�是å�—é™� C API 的组æˆ�éƒ¨åˆ†ï¼Œå®ƒè¢«æ ‡è®°ä¸ºç§�有以表明该 API 的使用å�—到é™�制并且å�ªé€‚用于é�žå¸¸å°‘çš„ã€�低层级的用例。 这个 API çš„è¯ä¹‰å°†æ ¹æ�®éœ€è¦�éš� Python 的一起å�‘生å�˜åŒ–。
��
- PEP 523 -- å�‘ CPython æ·»åŠ å¸§æ±‚å€¼ API
PEP 由 Brett Cannon 和 Dino Viehland 撰写。
PYTHONMALLOC 环境��¶
æ–°çš„ PYTHONMALLOC 环境å�˜é‡�å…�许设置 Python 内å˜åˆ†é…�器并安装调试钩å�。
现在将å�¯ä»¥ä½¿ç”¨ PYTHONMALLOC=debug 在以å�‘布模å¼�编译的 Python 上为 Python 内å˜åˆ†é…�器安装调试钩å�。 调试钩å�的效果:
新分é…�的内å˜ä¸å¡«å……å—节
0xCB释放的内å˜ä¸å¡«å……了å—节
0xDB检测è¿�å�� Python 内å˜åˆ†é…�器 API çš„æ“�作。 例如,
PyObject_Free()在PyMem_Malloc()所分é…�的内å˜å�—上被调用。在缓冲区开始之å‰�检测写æ“�作(缓冲区下溢)
在缓冲区结��检测写�作(缓冲区溢出)
检测当调用
PYMEM_DOMAIN_OBJ(如:PyObject_Malloc()) 和PYMEM_DOMAIN_MEM(如:PyMem_Malloc()) 域的分�器函数时是��有 GIL。
检查是��留了 GIL 也是Python 3.6 的新特性。
请å�‚阅 PyMem_SetupDebugHooks() 函数æ�¥äº†è§£ Python 内å˜åˆ†é…�器上的调试钩å�。
现在还å�¯ä»¥ä½¿ç”¨ PYTHONMALLOC=malloc 为所有的 Python 内å˜åˆ†é…�强制使用 C 库的 malloc() 分é…�器。 这在以å�‘布模å¼�编译的 Python 上使用外部内å˜è°ƒè¯•器如 Valgrind 时会很有用处。
å�‘生错误时,Python 内å˜åˆ†é…�器上的调试钩å�现在会使用 tracemalloc 模å�—æ�¥èŽ·å�–内å˜å�—被分é…�所在ä½�置上的回溯。
使用 python3.6 -X tracemalloc=5 (在回溯ä¸å˜å‚¨ 5 帧) 的缓冲区溢出的致命错误示例:
Debug memory block at address p=0x7fbcd41666f8: API 'o'
4 bytes originally requested
The 7 pad bytes at p-7 are FORBIDDENBYTE, as expected.
The 8 pad bytes at tail=0x7fbcd41666fc are not all FORBIDDENBYTE (0xfb):
at tail+0: 0x02 *** OUCH
at tail+1: 0xfb
at tail+2: 0xfb
at tail+3: 0xfb
at tail+4: 0xfb
at tail+5: 0xfb
at tail+6: 0xfb
at tail+7: 0xfb
The block was made by call #1233329 to debug malloc/realloc.
Data at p: 1a 2b 30 00
Memory block allocated at (most recent call first):
File "test/test_bytes.py", line 323
File "unittest/case.py", line 600
File "unittest/case.py", line 648
File "unittest/suite.py", line 122
File "unittest/suite.py", line 84
Fatal Python error: bad trailing pad byte
Current thread 0x00007fbcdbd32700 (most recent call first):
File "test/test_bytes.py", line 323 in test_hex
File "unittest/case.py", line 600 in run
File "unittest/case.py", line 648 in __call__
File "unittest/suite.py", line 122 in run
File "unittest/suite.py", line 84 in __call__
File "unittest/suite.py", line 122 in run
File "unittest/suite.py", line 84 in __call__
...
(由 Victor Stinner 在 bpo-26516 å’Œ bpo-26564 ä¸è´¡çŒ®ã€‚)
DTrace 和 SystemTap 探测支�¶
Python 现在å�¯ä»¥é™„带 --with-dtrace æ�¥æž„建以便为解释器ä¸çš„下列事件å�¯ç”¨é�™æ€�æ ‡è®°:
函数调用/返回
垃圾收集开始/完�
执行的代ç �行。
è¿™å�¯è¢«ç”¨æ�¥åœ¨ç”Ÿäº§çŽ¯å¢ƒä¸æŽ§åˆ¶æ£åœ¨è¿�è¡Œçš„è§£é‡Šå™¨ï¼Œè€Œæ— éœ€é‡�新编译特定的 调试版本 或æ��供应用专属的性能分æž�/调试代ç �。
更多信�,请�� 使用 DTrace 和 SystemTap 检测CPython 。
当å‰�的实现已在 Linux å’Œ macOS 上进行了测试。将æ�¥å�¯èƒ½ä¼šæ·»åŠ å…¶ä»–æ ‡è®°ã€‚
(由 Å�ukasz Langa 在 bpo-21590 ä¸è´¡çŒ®ï¼ŒåŸºäºŽ Jesús Cea Avión, David Malcolm å’Œ Nikhil Benesch 的补ä¸�。)
å…¶ä»–è¯è¨€ç‰¹æ€§ä¿®æ”¹Â¶
对Python è¯è¨€æ ¸å¿ƒè¿›è¡Œçš„å°�改动:
现在
global或nonlocalè¯å�¥å¿…须以文本形å¼�出现在å�Œä¸€ä½œç”¨åŸŸä¸é¦–次使用å�—å½±å“�çš„å��称之å‰�。 在之å‰�版本ä¸è¿™å�ªæ˜¯SyntaxWarning。现在å�¯ä»¥å°†æŸ�个 特殊方法 设为
Noneæ�¥è¡¨ç¤ºç›¸åº”æ“�作ä¸�å�¯ç”¨ã€‚ 举例æ�¥è¯´ï¼Œå¦‚æžœæŸ�个类将__iter__()设为None,则该类就将ä¸�å�¯è¿ä»£ã€‚ (由 Andrew Barnert å’Œ Ivan Levkivskyi 在 bpo-25958 ä¸è´¡çŒ®ã€‚)由é‡�å¤�的回溯行组æˆ�的长åº�列现在将被简化为
"[Previous line repeated {count} more times]"(请å�‚阅 回溯 获å�–æ ·ä¾‹ï¼‰ã€‚ (由 Emanuel Barry 在 bpo-26823 ä¸è´¡çŒ®ã€‚)现在导入æ“�ä½œåœ¨æ— æ³•æ‰¾åˆ°æ¨¡å�—时将引å�‘新的异常
ModuleNotFoundError(ImportErrorçš„å�ç±»)。 ç›®å‰� (在 try-except ä¸) 检测 ImportError 的代ç �ä»�将有效。 (由 Eric Snow 在 bpo-15767 ä¸è´¡çŒ®ã€‚)现在ä¾�赖于零å�‚æ•°å½¢å¼�
super()的类方法在类创建期间从元类方法调用时将æ£ç¡®åœ°ç”Ÿæ•ˆã€‚ (由 Martin Teichmann 在 bpo-23722 ä¸è´¡çŒ®ã€‚)
新增模�¶
secrets¶
æ–°çš„ secrets 模å�—的主è¦�目的是æ��供一ç§�直观的方å¼�æ�¥å�¯é� 地生æˆ�适用于密ç �管ç�†çš„é«˜åŠ å¯†å¼ºåº¦çš„ä¼ªéš�机值,如账户验è¯�ã€�安免凿�®ç‰ç‰ã€‚
è¦å‘Š
注æ„� random 模å�—ä¸çš„伪éš�机数å�‘生器 ä¸�应 被用于安全目的。 请在 Python 3.6+ 上使用 secrets 而在 Python 3.5 å�Šæ›´æ—©çš„版本上使用 os.urandom()。
��
- PEP 506 -- Secrets模å�—è¢«åŠ å…¥Pythonæ ‡å‡†åº“
PEP 由 Steven D'Aprano 撰写并实现。
改进的模�¶
array¶
现在已被耗尽的输出 array.array çš„è¿ä»£å™¨å°†ä¿�æŒ�耗尽状æ€�,å�³ä½¿è¿ä»£å�Žçš„æ•°ç»„被扩展时也是如æ¤ã€‚ 这将与其他å�¯å�˜åº�列的行为ä¿�æŒ�一致。
ç”± Serhiy Storchaka 在 bpo-26492 ä¸è´¡çŒ®ã€‚
ast¶
新增了 ast.Constant AST 节点。 它å�¯è¢«å¤–部 AST 优化器用于常é‡�折å� æ“�作。
ç”± Victor Stinner 在 bpo-26146 ä¸è´¡çŒ®ã€‚
asyncio¶
从 Python 3.6 开始 asyncio 模���处于暂定状�,其 API 被认为已�稳定。
自 Python 3.5.0 以æ�¥ asyncio 模å�—ä¸å€¼å¾—注æ„�çš„å�˜åŒ–(由于暂定状æ€�所有å�˜åŒ–都已å��å�‘ç§»æ¤�到 3.5.x):
get_event_loop()函数已更改为当在例程和回调ä¸è¢«è°ƒç”¨æ—¶å§‹ç»ˆè¿”回当å‰�æ£åœ¨è¿�行的循环。(由 Yury Selivanov 在 bpo-28613 ä¸è´¡çŒ®ã€‚)ensure_future()函数以å�Šæ‰€æœ‰ç”¨åˆ°å®ƒçš„函数,比如loop.run_until_complete(),现在将接å�—所有ç§�类的 å�¯ç‰å¾…对象。 (由 Yury Selivanov 贡献。)新增
run_coroutine_threadsafe()函数用于从其他线程�事件循环�交�程。(由 Vincent Michel 贡献。)新增
Transport.is_closing()æ–¹æ³•ç”¨äºŽæ£€æŸ¥ä¼ è¾“æ˜¯å�¦æ£åœ¨å…³é—或已ç»�å…³é—。 (由 Yury Selivanov 贡献。)loop.create_server()方法现在å�¯ä»¥æŽ¥å�—一个主机列表。 (由 Yann Sionneau 贡献。)新增
loop.create_future()方法用æ�¥åˆ›å»º Future 对象。 è¿™å…�许替代性的事件循环实现,比如 uvloop,以æ��供更快速的asyncio.Future实现。 (由 Yury Selivanov 在 bpo-27041 ä¸è´¡çŒ®ã€‚)新增
loop.get_exception_handler()方法用于获å�–当å‰�异常处ç�†å�¥æŸ„。 (由 Yury Selivanov 在 bpo-27040 ä¸è´¡çŒ®ã€‚)新增
StreamReader.readuntil()方法用于从æµ�读å�–æ•°æ�®ç›´åˆ°å‡ºçŽ°ä½œä¸ºåˆ†éš”ç¬¦çš„å—节åº�列。 (由 Mark Korenberg 贡献。)StreamReader.readexactly()的性能已获得æ��å�‡ã€‚ (由 Mark Korenberg 在 bpo-28370 ä¸è´¡çŒ®ã€‚)loop.getaddrinfo()方法已获得优化已é�¿å…�当地å�€å·²è¢«è§£æž�时调用系统getaddrinfo函数。 (由 A. Jesse Jiryu Davis 贡献。)loop.stop()方法已被更改为在当å‰�è¿ä»£ä¹‹å�Žç«‹å�³å�œæ¢å¾ªçŽ¯ã€‚ 任何作为上次è¿ä»£çš„ç»“æžœè¢«åŠ å…¥è®¡åˆ’ä»»åŠ¡çš„æ–°å›žè°ƒéƒ½å°†è¢«ä¸¢å¼ƒã€‚ (由 Guido van Rossum 在 bpo-25593 ä¸è´¡çŒ®ã€‚)现在
Future.set_exceptionåœ¨ä¼ å…¥ä¸€ä¸ªStopIteration异常的实例时将引å�‘TypeError。 (由 Chris Angelico 在 bpo-26221 ä¸è´¡çŒ®ã€‚)新增
loop.connect_accepted_socket()方法供接å�— asyncio 以外的连接,但使用 asyncio æ�¥å¤„ç�†å®ƒä»¬çš„æœ�务器使用。 (由 Jim Fulton 在 bpo-27392 ä¸è´¡çŒ®ã€‚)现在
TCP_NODELAYæ——æ ‡å°†é»˜è®¤é’ˆå¯¹æ‰€æœ‰ TCP ä¼ è¾“è¿›è¡Œè®¾ç½®ã€‚ (由 Yury Selivanov 在 bpo-27456 ä¸è´¡çŒ®ã€‚)新增
loop.shutdown_asyncgens()用æ�¥åœ¨ç»“æ�Ÿå¾ªçޝ之å‰�æ£ç¡®åœ°å…³é—现有的异æ¥ç”Ÿæˆ�器。 (由 Yury Selivanov 在 bpo-28003 ä¸è´¡çŒ®ã€‚)Futureå’ŒTask类现在已有ç»�优化过的 C 实现使得 asyncio 代ç �åŠ é€Ÿè‡³å¤š 30%。 (由 Yury Selivanov å’Œ INADA Naoki 在 bpo-26081 å’Œ bpo-28544 ä¸è´¡çŒ®ã€‚)
binascii¶
b2a_base64() 函数现在接å�—å�¯é€‰çš„ newline 关键å—å�‚数用æ�¥æŽ§åˆ¶æ˜¯å�¦è¦�åœ¨è¿”å›žå€¼ä¸æ·»åŠ æ�¢è¡Œç¬¦ã€‚ (由 Victor Stinner 在 bpo-25357 ä¸è´¡çŒ®ã€‚)
cmath¶
新增 cmath.tau (Ï„) 常é‡�。 (由 Lisa Roach 在 bpo-12345 ä¸è´¡çŒ®ï¼Œè¯¦æƒ…è§� PEP 628。)
新增常é‡�: cmath.inf å’Œ cmath.nan 用于匹é…� math.inf å’Œ math.nan,以å�Š cmath.infj å’Œ cmath.nanj 用于匹é…�ç”± complex çš„ repr æ‰€ä½¿ç”¨çš„æ ¼å¼�。 (由 Mark Dickinson 在 bpo-23229 ä¸è´¡çŒ®ã€‚)
collections¶
æ·»åŠ äº†æ–°çš„ Collection 抽象基类用于表示有具体大å°�çš„å�¯è¿ä»£å®¹å™¨ç±»ã€‚ (由 Ivan Levkivskyi 在 bpo-27598 ä¸è´¡çŒ®å¹¶ç”± Neil Girdhar 撰写文档。)
æ·»åŠ äº†æ–°çš„ Reversible 抽象基类用于表示å�Œæ—¶æ��ä¾› __reversed__() 方法的å�¯è¿ä»£ç±»ã€‚ (由 Ivan Levkivskyi 在 bpo-25987 ä¸è´¡çŒ®ã€‚)
新增代表异æ¥ç”Ÿæˆ�器的 AsyncGenerator 抽象基类。 (由 Yury Selivanov 在 bpo-28720 ä¸è´¡çŒ®ã€‚)
namedtuple() 函数现在接å�—å�¯é€‰çš„关键å—å�‚æ•° module,当指定该å�‚数时,它将被用作所返回的具å��元组类的 __module__ 属性。 (由 Raymond Hettinger 在 bpo-17941 ä¸è´¡çŒ®ã€‚)
namedtuple() çš„ verbose å’Œ rename å�‚数现在是仅é™�关键å—å�‚数。 (由 Raymond Hettinger 在 bpo-25628 ä¸è´¡çŒ®ã€‚)
递归的 collections.deque 实例现在å�¯ä»¥è¢« pickle。 (由 Serhiy Storchaka 在 bpo-26482 ä¸è´¡çŒ®ã€‚)
concurrent.futures¶
ThreadPoolExecutor ç±»æž„é€ å™¨çŽ°åœ¨æŽ¥å�—å�¯é€‰çš„ thread_name_prefix å�‚æ•°ä»¥ä¾¿èƒ½å¤Ÿè‡ªå®šä¹‰ç”±çº¿ç¨‹æ± æ‰€åˆ›å»ºçš„çº¿ç¨‹çš„å��称。 (由 Gregory P. Smith 在 bpo-27664 ä¸è´¡çŒ®ã€‚)
contextlib¶
å¢žåŠ äº† contextlib.AbstractContextManager 类用æ�¥æ��供上下文管ç�†å™¨çš„æŠ½è±¡åŸºç±»ã€‚ 它为 __enter__() æ��供了一个å�ˆç�†çš„默认实现,该实现将返回 self å¹¶å°† __exit__() 设为抽象方法。 在 typing ä¸å¢žåŠ äº†å¯¹åº”çš„ç±» typing.ContextManager。 (由 Brett Cannon 在 bpo-25609 ä¸è´¡çŒ®ã€‚)
datetime¶
datetime å’Œ time 类新增了 fold 属性用æ�¥åœ¨å¿…è¦�时消除本地时间的æ§ä¹‰ã€‚ 在 datetime ä¸çš„许多函数已被更新为支æŒ�本地时间的消除æ§ä¹‰ã€‚ 请å�‚阅 本地时间消æ§ä¹‰ 一节了解更多信æ�¯ã€‚ (由 Alexander Belopolsky 在 bpo-24773 ä¸è´¡çŒ®ã€‚)
现在 datetime.strftime() å’Œ date.strftime() 方法将支æŒ� ISO 8601 日期指令符 %G, %u å’Œ %V。 (由 Ashley Anderson 在 bpo-12006 ä¸è´¡çŒ®ã€‚).)
datetime.isoformat() 函数现在接å�—å�¯é€‰çš„ timespec å�‚数用æ�¥æŒ‡å®šæ—¶é—´å€¼è¦�包括的é¢�外组件数é‡�。 (由 Alessandro Cucci å’Œ Alexander Belopolsky 在 bpo-19475 ä¸è´¡çŒ®ã€‚)
datetime.combine() 现在接å�—å�¯é€‰çš„ tzinfo å�‚数。 (由 Alexander Belopolsky 在 bpo-27661 ä¸è´¡çŒ®ã€‚)
decimal¶
新增 Decimal.as_integer_ratio() 方法,它返回一对整数 (n, d) 将给定的 Decimal 实例表示为一个最简形å¼�且分æ¯�为æ£å€¼çš„分数:
>>> Decimal('-3.14').as_integer_ratio()
(-157, 50)
(由 Stefan Krah å’Œ Mark Dickinson 在 bpo-25928 ä¸è´¡çŒ®ã€‚)
distutils¶
distutils.command.sdist.sdist çš„ default_format 属性已被移除且 formats 属性默认为 ['gztar']。 虽然ä¸�作è¦�求,但任何ä¾�赖于 default_format çš„å˜åœ¨çš„代ç �都å�¯èƒ½éœ€è¦�修改。 请å�‚阅 bpo-27819 了解更多细节。
email¶
é€šè¿‡å¤šä¸ªæž„é€ å™¨çš„ policy 关键嗿�¥å�¯ç”¨çš„æ–° email API å·²ä¸�å†�为暂定状æ€�。 email 文档已被é‡�新组织并é‡�新撰写以è�šé›†æ–° API,å�Œæ—¶ä¿�留旧å¼� API 的原有文档。 (由 R. David Murray 在 bpo-24277 ä¸è´¡çŒ®ã€‚)
email.mime ä¸çš„类现在都接å�—å�¯é€‰çš„ policy 关键å—å�‚数。 (由 Berker Peksag 在 bpo-27331 ä¸è´¡çŒ®ã€‚).)
DecodedGenerator 现在支æŒ� policy 关键å—。
新增 policy 属性,message_factory 控制当解æž�器新建消æ�¯å¯¹è±¡æ—¶é»˜è®¤è¦�使用的类。 对于 email.policy.compat32 ç–ç•¥æ�¥è¯´å°†ä¸º Message,对于新ç–ç•¥æ�¥è¯´å°†ä¸º EmailMessage。 (由 R. David Murray 在 bpo-20476 ä¸è´¡çŒ®ã€‚)
encodings¶
在 Windows ä¸Šï¼Œå¢žåŠ äº† 'oem' ç¼–ç �æ ¼å¼�用于 CP_OEMCP,以å�Š 'ansi' 别å��用于现有的 'mbcs' ç¼–ç �æ ¼å¼�,它使用 CP_ACP 代ç �页。 (由 Steve Dower 在 bpo-27959 ä¸è´¡çŒ®ã€‚)
enum¶
在 enum 模å�—䏿–°å¢žäº†ä¸¤ä¸ªæžšä¸¾åŸºç±»: Flag å’Œ IntFlags。 两者å�‡è¢«ç”¨äºŽå®šä¹‰å�¯ä½¿ç”¨æŒ‰ä½�è¿�算符进行组å�ˆçš„常é‡�。 (由 Ethan Furman 在 bpo-23591 ä¸è´¡çŒ®ã€‚)
è®¸å¤šæ ‡å‡†åº“æ¨¡å�—已被更新以使用 IntFlags 类作为其常é‡�。
新增的 enum.auto 值�被用于自动为枚举�员赋值:
>>> from enum import Enum, auto
>>> class Color(Enum):
... red = auto()
... blue = auto()
... green = auto()
...
>>> list(Color)
[<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>]
faulthandler¶
在 Windows 上,faulthandler 模å�—现在会为 Windows 异常安装处ç�†å�¥æŸ„:å�‚è§� faulthandler.enable()。 (由 Victor Stinner 在 bpo-23848 ä¸è´¡çŒ®ã€‚)
fileinput¶
hook_encoded() 现在支æŒ� errors å�‚数。 (由 Joseph Hackman 在 bpo-25788 ä¸è´¡çŒ®ã€‚)
hashlib¶
hashlib 已支æŒ� OpenSSL 1.1.0。 最低的建议版本为 1.0.2。 (由 Christian Heimes 在 bpo-26470 ä¸è´¡çŒ®ã€‚)
本模å�—å¢žåŠ äº† BLAKE2 哈希函数。 blake2b() å’Œ blake2s() 将始终å�¯ç”¨å¹¶æ”¯æŒ� BLAKE2 的完整特性集。 (由 Christian Heimes 在 bpo-26798 ä¸åŸºäºŽ Dmitry Chestnykh å’Œ Samuel Neves 的代ç �贡献。 文档由 Dmitry Chestnykh 撰写。)
å¢žåŠ äº† SHA-3 哈希函数 sha3_224(), sha3_256(), sha3_384(), sha3_512(),以å�Š SHAKE 哈希函数 shake_128() å’Œ shake_256()。 (由 Christian Heimes 在 bpo-16113 ä¸è´¡çŒ®ã€‚ Keccak 代ç �包由 Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche å’Œ Ronny Van Keer 编写。)
基于密ç �的密钥推导函数 scrypt() 现å�¯ç”¨äºŽ OpenSSL 1.1.0 å�Šæ›´æ–°ç‰ˆæœ¬ã€‚ (由 Christian Heimes 在 bpo-27928 ä¸è´¡çŒ®ã€‚)
http.client¶
HTTPConnection.request() å’Œ endheaders() 现在都支æŒ�分å�—ç¼–ç �æ ¼å¼�请求体。 (由 Demian Brecht å’Œ Rolf Krahl 在 bpo-12319 ä¸è´¡çŒ®ã€‚)
idlelib 与 IDLE¶
对 idlelib 包执行现代化和é‡�构以使 IDLE 的外观和功能更好并使代ç �更易于ç�†è§£ã€�测试和改进。 让 IDLE 外观更好的部分工作,尤其是在 Linux å’Œ Mac 上,在于使用了 ttk 部件,主è¦�是在对è¯�框ä¸ã€‚ å› æ¤ï¼ŒIDLE ä¸�å†�使用 tcl/tk 8.4。 现在它需è¦� tcl/tk 8.5 或 8.6。 我们建议è¿�行这两个软件的最新å�‘布版。
‘现代化’包括 idlelib 模å�—çš„é‡�命å��与å�ˆå¹¶ã€‚ 对具有部分大写å��称的文件的é‡�命å��类似于 3.0 ä¸å°† Tkinter å’Œ TkFont é‡�命å��为 tkinter å’Œ tkinter.font。 å› æ¤ï¼Œåœ¨ 3.5 ä¸å�¯ç”¨çš„ idlelib 文件导入在 3.6 ä¸é€šå¸¸å°†ä¸�å†�å�¯ç”¨ã€‚ 至少需è¦�修改模å�—å��称(å�‚è§� idlelib/README.txt),有时还需è¦�更多修改。 (å��称更改由 Al Swiegart å’Œ Terry Reedy 在 bpo-24225 ä¸è´¡çŒ®ã€‚ 大多数 idlelib è¡¥ä¸�都是已ç»�是或å�³å°†çº³å…¥è¯¥å¤„ç�†è¿‡ç¨‹ã€‚)
作为补å�¿ï¼Œæœ€ç»ˆçš„结果是一些 idlelib 类将更会易于使用,并有更好的 API 和文档å—ç¬¦ä¸²åŠ ä»¥è¯´æ˜Žã€‚ é™„åŠ çš„æœ‰ç”¨ä¿¡æ�¯å‡†å¤‡å¥½å�Žå°†è¢«æ·»åŠ åˆ° idlelib ä¸ã€‚
在 3.6.2 䏿–°å¢ž:
多个对自动补全的修æ£ã€‚ (由 Louie Lu 在 bpo-15786 ä¸è´¡çŒ®ã€‚)
在 3.6.3 䏿–°å¢ž:
Module Browser (在 File è�œå�•ä¸ï¼Œä¹‹å‰�称为 Class Browser) 现在会在最高层级函数和类之外显示嵌套的函数和类。 (由 Guilherme Polo, Cheryl Sabella å’Œ Terry Jan Reedy 在 bpo-1612262 ä¸è´¡çŒ®ã€‚)
之å‰�以扩展形å¼�实现的 IDLE 特性已作为æ£å¸¸ç‰¹æ€§é‡�新实现。 它们的设置已从 Extensions 选项å�¡ç§»è‡³å…¶ä»–对è¯�框选项å�¡ã€‚ (由 Charles Wohlganger å’Œ Terry Jan Reedy 在 bpo-27099 ä¸å®žçŽ°ã€‚ï¼‰
Settings 对è¯�框 (Options ä¸çš„ Configure IDLE) å·²ç»�被部分é‡�写以改进外观和功能。 (由 Cheryl Sabella å’Œ Terry Jan Reedy 在多个问题项ä¸è´¡çŒ®ã€‚)
在 3.6.4 䏿–°å¢ž:
å—ä½“æ ·æœ¬çŽ°åœ¨åŒ…æ‹¬ä¸€ç»„é�žæ‹‰ä¸�å—符以便用户能更好地查看所选特定å—体的效果。 (由 Terry Jan Reedy 在 bpo-13802 ä¸è´¡çŒ®ã€‚) æ ·æœ¬å�¯ä»¥è¢«ä¿®æ”¹ä»¥åŒ…括其他å—符。 (由 Serhiy Storchaka 在 bpo-31860 ä¸è´¡çŒ®ã€‚)
在 3.6.6 䏿–°å¢ž:
编辑器代ç �上下文选项已ç»�过修改。 Box 会显示所有上下文行直到最大行数。 点击一个上下文行会使编辑器跳转到该行。 è‡ªå®šä¹‰ä¸»é¢˜çš„ä¸Šä¸‹æ–‡é¢œè‰²å·²æ·»åŠ åˆ° Settings 对è¯�框的 Highlights 选项å�¡ã€‚ (由 Cheryl Sabella å’Œ Terry Jan Reedy 在 bpo-33642, bpo-33768 å’Œ bpo-33679 ä¸è´¡çŒ®ã€‚)
在 Windows 上,会有新的 API 调用将 tk 对 DPI 的调整告知 Windows。 在 Windows 8.1+ 或 10 上,如果 Python 二进制ç �çš„ DPI 兼容属性未改å�˜ï¼Œå¹¶ä¸”监视器分辨率大于 96 DPI,这应该会令文本和线æ�¡æ›´æ¸…晰。 å�¦åˆ™çš„è¯�它应该ä¸�é€ æˆ�å½±å“�。 (由 Terry Jan Reedy 在 bpo-33656 ä¸è´¡çŒ®ã€‚)
在 3.6.7 䏿–°å¢ž:
超过 N 行(默认值为 50)的输出将被折å� 为一个按钮。 N å�¯ä»¥åœ¨ Settings 对è¯�框的 General 页的 PyShell 部分ä¸è¿›è¡Œä¿®æ”¹ã€‚ æ•°é‡�较少但是超长的行å�¯ä»¥é€šè¿‡åœ¨è¾“出上å�³å‡»æ�¥æŠ˜å� 。 被折å� 的输出å�¯é€šè¿‡å�Œå‡»æŒ‰é’®æ�¥å±•开,或是通过å�³å‡»æŒ‰é’®æ�¥æ”¾å…¥å‰ªè´´æ�¿æˆ–是å�•独的窗å�£ã€‚ (由 Tal Einat 在 bpo-1529353 ä¸è´¡çŒ®ã€‚)
importlib¶
现在导入æ“�ä½œåœ¨æ— æ³•æ‰¾åˆ°æ¨¡å�—时将引å�‘新的异常 ModuleNotFoundError (ImportError çš„å�ç±»)。 ç›®å‰� (在 try-except ä¸) 检测 ImportError 的代ç �ä»�将有效。 (由 Eric Snow 在 bpo-15767 ä¸è´¡çŒ®ã€‚)
importlib.util.LazyLoader çŽ°åœ¨å°†è°ƒç”¨è¢«åŒ…è£…çš„åŠ è½½å™¨ä¸Šçš„ create_module(),移除了 importlib.machinery.BuiltinImporter å’Œ importlib.machinery.ExtensionFileLoader ä¸�能用于 importlib.util.LazyLoader çš„é™�制。
importlib.util.cache_from_source(), importlib.util.source_from_cache() 和 importlib.util.spec_from_file_location() 现在将接� path-like object。
inspect¶
inspect.signature() 函数现在会报告编译器为推导å¼�和生æˆ�器表达å¼�作用域生æˆ�çš„éš�å¼� .0 å½¢å�‚,就åƒ�它们是调用``implicit0`` 时的仅é™�ä½�置形å�‚ä¸€æ ·ã€‚ (由 Jelle Zijlstra 在 bpo-19611 ä¸è´¡çŒ®ã€‚)
为了å‡�少从 Python 2.7 和旧å¼� inspect.getargspec() API å�‡çº§æ—¶çš„代ç �问题,先å‰�被写入文档的对 inspect.getfullargspec() 的弃用已被撤销。 虽然这个函数对于å�•/æº� Python 2/3 代ç �库æ�¥è¯´å¾ˆæ–¹ä¾¿ï¼Œä½†å¯¹äºŽæ–°ä»£ç �æ�¥è¯´åŠŸèƒ½æ›´ä¸°å¯Œçš„ inspect.signature() 接å�£ä»�然是推è��的方å¼�。 (由 Nick Coghlan 在 bpo-27172 ä¸è´¡çŒ®ã€‚)
json¶
现在 json.load() å’Œ json.loads() å�‡æ”¯æŒ�二进制输入。 已编ç �çš„ JSON 应当使用 UTF-8, UTF-16 或 UTF-32 æ�¥è¡¨ç¤ºã€‚ (由 Serhiy Storchaka 在 bpo-17909 ä¸è´¡çŒ®ã€‚)
logging¶
新增 WatchedFileHandler.reopenIfNeeded() æ–¹æ³•ä»¥æ·»åŠ æ£€æµ‹æ—¥å¿—æ–‡ä»¶æ˜¯å�¦éœ€è¦�被é‡�新打开的能力。 (由 Marian Horban 在 bpo-24884 ä¸è´¡çŒ®ã€‚).)
math¶
为 math å’Œ cmath 模å�—å¢žåŠ äº† tau (Ï„) 常é‡�。 (由 Lisa Roach 在 bpo-12345 ä¸è´¡çŒ®ï¼Œè¯¦æƒ…è§� PEP 628。)
multiprocessing¶
ç”± multiprocessing.Manager() 返回的 代ç�†å¯¹è±¡ 现在å�¯ä»¥è¢«åµŒå¥—。 (由 Davin Potts 在 bpo-6766 ä¸è´¡çŒ®ã€‚)
os¶
请�阅 PEP 519 的概览了解现在 os 和 os.path 模�如何支� 路径型对象 的详情。
现在 scandir() 支� Windows 上的 bytes 路径。
新增的 close() 方法å…�许显å¼�åœ°å…³é— scandir() è¿ä»£å™¨ã€‚ scandir() è¿ä»£å™¨çŽ°åœ¨æ”¯æŒ� context manager å��议。 如果一个 scandir() è¿ä»£å™¨æ—¢æ²¡æœ‰è¢«è€—尽也没有被显å¼�地关é—则会在其æž�构器ä¸å�‘出 ResourceWarning。 (由 Serhiy Storchaka 在 bpo-25994 ä¸è´¡çŒ®ã€‚)
在 Linux 上,现在 os.urandom() 会阻塞直到系统的 urandom ç†µæ± è¢«åˆ�始化以æ��å�‡å®‰å…¨æ€§ã€‚ å…¶ç�†ç”±å�‚è§� PEP 524。
Linux getrandom() 系统调用(获å�–éš�机å—节数æ�®ï¼‰çŽ°åœ¨è¢«æš´éœ²ä¸ºæ–°çš„ os.getrandom() 函数。 (由 Victor Stinner 贡献,为 PEP 524 的一部分)
pathlib¶
pathlib 现在支æŒ� 路径型对象。 (由 Brett Cannon 在 bpo-27186 ä¸è´¡çŒ®ã€‚)
请�阅 PEP 519 的概览了解详情。
pdb¶
Pdb ç±»æž„é€ å™¨æ–°å¢žå�¯é€‰çš„ readrc å�‚数用æ�¥æŽ§åˆ¶æ˜¯å�¦åº”当读å�– .pdbrc 文件。
pickle¶
需è¦�附带关键å—å�‚数调用 __new__ 的对象现在å�¯ä»¥ä½¿ç”¨æ—©äºŽå��议版本 4 çš„ pickle å��è®® æ�¥ pickle。 å��议版本 4 之å‰�已支æŒ�æ¤åœºæ™¯ã€‚ (由 Serhiy Storchaka 在 bpo-24164 ä¸è´¡çŒ®ã€‚)
pickletools¶
现在 pickletools.dis() 将为 MEMOIZE æ“�作ç �输出éš�å¼�çš„ memo 索引。 (由 Serhiy Storchaka 在 bpo-25382 ä¸è´¡çŒ®ã€‚)
pydoc¶
pydoc 模å�—将能é�µå®ˆ MANPAGER 环境å�˜é‡�的设置。 (由 Matthias Klose 在 bpo-8637 ä¸è´¡çŒ®ã€‚)
help() å’Œ pydoc 现在将以具å��å…ƒç»„å—æ®µè¢«å®šä¹‰çš„顺åº�而é�žå—æ¯�顺åº�列出它们。 (由 Raymond Hettinger 在 bpo-24879 ä¸è´¡çŒ®ã€‚)
random¶
新增 choices() 函数用于从给定的总体ä¸è¿”回指定大å°�çš„å…ƒç´ åˆ—è¡¨å¹¶æœ‰å�¯é€‰æ�ƒé‡�。 (由 Raymond Hettinger 在 bpo-18844 ä¸è´¡çŒ®ã€‚)
re¶
在æ£åˆ™è¡¨è¾¾å¼�ä¸å¢žåŠ äº†å¯¹ä¿®é¥°ç¬¦åŒºæ®µçš„æ”¯æŒ�。 示例: '(?i:p)ython' 匹é…� 'python' å’Œ 'Python',但ä¸�匹é…� 'PYTHON'ï¼›'(?i)g(?-i:v)r' 匹é…� 'GvR' å’Œ 'gvr',但ä¸�匹é…� 'GVR'。 (由 Serhiy Storchaka 在 bpo-433028 ä¸è´¡çŒ®ã€‚)
Match 对象分组å�¯é€šè¿‡ __getitem__ æ�¥è®¿é—®ï¼Œè¿™ç‰ä»·äºŽ group()。 å› æ¤ mo['name'] 现在将ç‰ä»·äºŽ mo.group('name')。 (由 Eric Smith 在 bpo-24454 ä¸è´¡çŒ®ã€‚)
Match 对象现在支æŒ�å°† 索引型对象 作为分组索引。 (由 Jeroen Demeyer å’Œ Xiang Zhang 在 bpo-27177 ä¸è´¡çŒ®ã€‚)
readline¶
新增 set_auto_history() æ�¥å�¯ç”¨æˆ–ç¦�用历å�²åˆ—è¡¨è¾“å…¥çš„è‡ªåŠ¨æ·»åŠ ã€‚ (由 Tyler Crompton 在 bpo-26870 ä¸è´¡çŒ®ã€‚)
rlcompleter¶
ç§�有和特殊属性å��称现在会被çœ�略除é�žå¸¦æœ‰ä»¥ä¸‹åˆ’线开头的å‰�缀。 在æŸ�些已完æˆ�的关键å—å�Žä¼šåŠ ä¸Šç©ºæ ¼æˆ–å†’å�·ã€‚ (由 Serhiy Storchaka 在 bpo-25011 å’Œ bpo-25209 ä¸è´¡çŒ®ã€‚)
shlex¶
shlex 通过新的 punctuation_chars å�‚æ•°æ�¥æŽ§åˆ¶å“ªäº›å—ç¬¦ä¼šè¢«å½“ä½œæ ‡ç‚¹ç¬¦å�·å¤§å¹…度地 改进了 shell 兼容性。 (由 Vinay Sajip 在 bpo-1521950 ä¸è´¡çŒ®ã€‚)
site¶
当在 .pth æ–‡ä»¶ä¸æŒ‡å®šè¦�æ·»åŠ åˆ° sys.path çš„è·¯å¾„æ—¶ï¼ŒçŽ°åœ¨ä½ å�¯ä»¥æŒ‡å®šä½�于目录顶部的文件路径(例如 zip 文件)。 (由 Wolfgang Langner 在 bpo-26587 ä¸è´¡çŒ®ã€‚)
sqlite3¶
sqlite3.Cursor.lastrowid 现在支æŒ� REPLACE è¯å�¥ã€‚ (由 Alex LordThorsen 在 bpo-16864 ä¸è´¡çŒ®ã€‚)
socket¶
ioctl() 函数现在支æŒ� SIO_LOOPBACK_FAST_PATH 控制ç �。 (由 Daniel Stokes 在 bpo-26536 ä¸è´¡çŒ®ã€‚)
getsockopt() 常é‡� SO_DOMAIN, SO_PROTOCOL, SO_PEERSEC å’Œ SO_PASSSEC 现在已得到支æŒ�。 (由 Christian Heimes 在 bpo-26907 ä¸è´¡çŒ®ã€‚)
setsockopt() 现在支æŒ� setsockopt(level, optname, None, optlen: int) 的形å¼�。 (由 Christian Heimes 在 bpo-27744 ä¸è´¡çŒ®ã€‚)
现在 socket 模å�—已支æŒ�地å�€æ—� AF_ALG 到 Linux Kernel crypto API 的接å�£ã€‚ å¢žåŠ äº† ALG_*, SOL_ALG å’Œ sendmsg_afalg()。 (由 Christian Heimes 在 bpo-27744 ä¸è´¡çŒ®å¹¶å¾—到 Victor Stinner çš„å��助。)
新增 Linux 常é‡� TCP_USER_TIMEOUT å’Œ TCP_CONGESTION。 (由 Omar Sandoval 在 bpo-26273 ä¸è´¡çŒ®ã€‚)
socketserver¶
基于 socketserver 模å�—çš„æœ�务器,包括在 http.serverã€�xmlrpc.server å’Œ wsgiref.simple_server ä¸å®šä¹‰çš„æœ�务器,现在都支æŒ� context manager å��议。(由 Aviv Palivoda 在 bpo-26404 ä¸è´¡çŒ®ã€‚)
StreamRequestHandler 类的 wfile 属性现在实现了 io.BufferedIOBase å�¯å†™æŽ¥å�£ã€‚ 特别地,现在调用 write() 会ä¿�è¯�完整地å�‘é€�æ•°æ�®ã€‚ (由 Martin Panter 在 bpo-26721 ä¸è´¡çŒ®ã€‚)
ssl¶
ssl 已支æŒ� OpenSSL 1.1.0。 最低的建议版本为 1.0.2。 (由 Christian Heimes 在 bpo-26470 ä¸è´¡çŒ®ã€‚)
已从默认的密ç �套件ä¸åˆ 除 3DES å¹¶æ·»åŠ äº† ChaCha20 Poly1305 密ç �套件。 (由 Christian Heimes 在 bpo-27850 å’Œ bpo-27766 ä¸è´¡çŒ®ã€‚)
SSLContext 已具有更好的选项和密ç �é…�置。 (由 Christian Heimes 在 bpo-28043 ä¸è´¡çŒ®ã€‚).)
SSL 会è¯�å�¯ä»¥é€šè¿‡æ–°çš„ SSLSession 类从一个客户端连接å¤�制到å�¦ä¸€ä¸ªã€‚ TLS 会è¯�æ�¢å¤�å�¯ä»¥åŠ å¿«åˆ�å§‹æ�¡æ‰‹è¿‡ç¨‹ã€�å‡�少延迟并æ��å�‡æ€§èƒ½ã€‚ (由 Christian Heimes æ ¹æ�® Alex Warhawk çš„è�‰æ¡ˆåœ¨ bpo-19500 ä¸è´¡çŒ®ã€‚)
æ–°çš„ get_ciphers() 方法å�¯è¢«ç”¨æ�¥èŽ·å�–按密ç �优先级排åº�的已å�¯ç”¨å¯†ç �列表。
所有常é‡�å’Œæ——æ ‡éƒ½å·²è¢«è½¬æ�¢ä¸º IntEnum å’Œ IntFlags。 (由 Christian Heimes 在 bpo-28025 ä¸è´¡çŒ®ã€‚)
为 SSLContext æ·»åŠ äº†æœ�务器和客户端专属的 TLS å��议。 (由 Christian Heimes 在 bpo-28085 ä¸è´¡çŒ®ã€‚)
å¢žåŠ äº† ssl.SSLContext.post_handshake_auth 以å�¯ç”¨å¹¶é€šè¿‡ ssl.SSLSocket.verify_client_post_handshake() æ�¥åˆ�始化 TLS 1.3 æ�¡æ‰‹å�ŽéªŒè¯�。 (由 Christian Heimes 在 gh-78851 ä¸è´¡çŒ®ã€‚)
statistics¶
新增 harmonic_mean() 函数。 (由 Steven D'Aprano 在 bpo-27181 ä¸è´¡çŒ®ã€‚)
struct¶
现在 struct å�¯é€šè¿‡ 'e' æ ¼å¼�说明符支æŒ� IEEE 754 å�Šç²¾åº¦æµ®ç‚¹æ•°ã€‚ (由 Eli Stevens å’Œ Mark Dickinson 在 bpo-11734 ä¸è´¡çŒ®ã€‚)
subprocess¶
现在 subprocess.Popen æž�构器会在å�进程ä»�ç„¶è¿�行时å�‘出 ResourceWarning è¦å‘Šã€‚ 请使用上下文管ç�†å™¨å��è®® (with proc: ...) 或显å¼�地调用 wait() 方法æ�¥è¯»å�–å�进程的退出状æ€�。 (由 Victor Stinner 在 bpo-26741 ä¸è´¡çŒ®ã€‚)
subprocess.Popen æž„é€ å™¨ä»¥å�Šæ‰€æœ‰ä¼šå�‘å…¶ä¼ é€’å�‚数的函数现在å�¯æŽ¥å�— encoding å’Œ errors å�‚数。 指定这两者ä¸çš„任何一个都将为 stdin, stdout å’Œ stderr æµ�å�¯ç”¨æ–‡æœ¬æ¨¡å¼�。 (由 Steve Dower 在 bpo-6135 ä¸è´¡çŒ®ã€‚)
sys¶
æ–°çš„ getfilesystemencodeerrors() 函数å�¯è¿”回在 Unicode 文件å��å’Œ bytes 文件å��之间进行转æ�¢æ—¶ä½¿ç”¨çš„错误模å¼�çš„å��称。 (由 Steve Dower 在 bpo-27781 ä¸è´¡çŒ®ã€‚)
在 Windows 上 getwindowsversion() 函数的返回值现在将包括 platform_version å—æ®µï¼Œè¯¥å—段包å�«å½“å‰�æ“�作系统准确的主版本ã€�次版本和构建版本å�·ï¼Œè€Œä¸�是进行所模拟的版本信æ�¯ã€‚ (由 Steve Dower 在 bpo-27932 䏿��供贡献。)
telnetlib¶
Telnet 现在是一个上下文管ç�†å™¨ã€‚ (由 Stéphane Wirtel 在 bpo-25485 ä¸è´¡çŒ®ã€‚)
time¶
现在 struct_time 的属性 tm_gmtoff 和 tm_zone 在所有平�上��用。
timeit¶
新增的 Timer.autorange() 便æ�·æ–¹æ³•会é‡�å¤�调用 Timer.timeit() 以使总è¿�行时间大于ç‰äºŽ 200 毫秒。 (由 Steven D'Aprano 在 bpo-6422 ä¸è´¡çŒ®ã€‚)
现在 timeit 在最佳时间和最差时间之间å˜åœ¨æ˜¾è‘—(4 å€�)差异时将会å�‘出è¦å‘Šã€‚ (由 Serhiy Storchaka 在 bpo-23552 ä¸è´¡çŒ®ã€‚)
tkinter¶
在 tkinter.Variable ç±»ä¸æ·»åŠ äº†æ–¹æ³• trace_add(), trace_remove() å’Œ trace_info()。 它们å�–代了使用过时 Tcl 命令的旧方法 trace_variable(), trace(), trace_vdelete() å’Œ trace_vinfo(),旧方法在未æ�¥ç‰ˆæœ¬çš„ Tcl ä¸å�¯èƒ½ä¼šæ— 法使用。 (由 Serhiy Storchaka 在 bpo-22115 ä¸è´¡çŒ®ã€‚)
回溯¶
traceback 模å�—和解释器的内置异常显示现在都会对回溯ä¸é‡�å¤�行的长åº�列进行缩写,如下é�¢çš„例å�所示:
>>> def f(): f()
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
[Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded
(由 Emanuel Barry在 bpo-26823 ä¸è´¡çŒ®ã€‚)
tracemalloc¶
tracemalloc 模å�—现在支æŒ�跟踪在多个ä¸�å�Œåœ°å�€ç©ºé—´ä¸çš„内å˜åˆ†é…�情况。
新增 DomainFilter 过滤器类用于按地�空间(域)过滤�跟踪信�。
(由 Victor Stinner 在 bpo-26588 ä¸è´¡çŒ®ã€‚)
typing¶
由于 typing 模å�—处于 暂定状æ€�,在 Python 3.6 ä¸å¼•入的所有改å�˜éƒ½å·²è¢«å��å�‘ç§»æ¤�到 Python 3.5.x。
typing 模å�—对泛型类别å��的支æŒ�得到大幅改进。 例如 Dict[str, Tuple[S, T]] çŽ°åœ¨å°†æ˜¯æœ‰æ•ˆçš„ç±»åž‹æ ‡æ³¨ã€‚ (由 Guido van Rossum 在 Github #195 ä¸è´¡çŒ®ã€‚)
å¢žåŠ typing.ContextManager 类用æ�¥è¡¨ç¤º contextlib.AbstractContextManager。 (由 Brett Cannon 在 bpo-25609 ä¸è´¡çŒ®ã€‚)
å¢žåŠ typing.Collection 类用æ�¥è¡¨ç¤º collections.abc.Collection。 (由 Ivan Levkivskyi 在 bpo-27598 ä¸è´¡çŒ®ã€‚)
å¢žåŠ typing.ClassVar 类型结构体用æ�¥æ ‡è®°ç±»å�˜é‡�。 å�˜é‡�æ ‡æ³¨åœ¨ PEP 526 ä¸è¢«å¼•入,包装在 ClassVar ä¸çš„å�˜é‡�æ ‡æ³¨è¡¨ç¤ºç»™å®šçš„å±žæ€§å°†è¢«ç”¨ä½œç±»å�˜é‡�而ä¸�应在该类的实例上设置。 (由 Ivan Levkivskyi 在 Github #280 ä¸è´¡çŒ®ã€‚)
新增 TYPE_CHECKING 常é‡�将被é�™æ€�类型检查器视为 True,但在è¿�行时将为 False。 (由 Guido van Rossum 在 Github #230 ä¸è´¡çŒ®ã€‚)
新增 NewType() 辅助函数用æ�¥åˆ›å»ºé’ˆå¯¹æ ‡æ³¨çš„è½»é‡�级å�•独类型:
from typing import NewType
UserId = NewType('UserId', int)
some_id = UserId(524313)
é�™æ€�类型检查器将把新类型当作原始类型的å�ç±»æ�¥å¤„ç�†ã€‚ (由 Ivan Levkivskyi 在 Github #189 ä¸è´¡çŒ®ã€‚)
unicodedata¶
unicodedata 模�现在使用�自 Unicode 9.0.0 的数�。 (由 Benjamin Peterson 贡献。)
unittest.mock¶
Mock 类具有以下改进:
两个新方法,
Mock.assert_called()å’ŒMock.assert_called_once()用于检测 mock 对象是å�¦å·²è¢«è°ƒç”¨ã€‚ (由 Amit Saha 在 bpo-26323 ä¸è´¡çŒ®ã€‚)Mock.reset_mock()方法现在有两个å�¯é€‰çš„ä»…é™�关键å—å�‚æ•°: return_value å’Œ side_effect。 (由 Kushal Das 在 bpo-21271 ä¸è´¡çŒ®ã€‚)
urllib.request¶
如果一个 HTTP 请求具有文件或å�¯è¿ä»£å¯¹è±¡è¯·æ±‚体(而ä¸�是 bytes 对象)但没有 Content-Length æ ‡å¤´ï¼ŒAbstractHTTPHandler 现在将ä¸�会抛出错误,而是回退为使用分å�—ä¼ è¾“ç¼–ç �æ ¼å¼�。 (由 Demian Brecht å’Œ Rolf Krahl 在 bpo-12319 ä¸è´¡çŒ®ã€‚)
urllib.robotparser¶
RobotFileParser 现在将支æŒ� Crawl-delay å’Œ Request-rate 扩展。 (由 Nikolay Bogoychev 在 bpo-16099 ä¸è´¡çŒ®ã€‚)
venv¶
venv 接å�—一个新的形å�‚ --prompt。 æ¤å½¢å�‚æ��供了用于虚拟环境的替代å‰�缀。 (由 Å�ukasz Balcerzak æ��议并由 Stéphane Wirtel 在 bpo-22829 ä¸ç§»æ¤�到 3.6。)
warnings¶
为 warnings.warn_explicit() 新增å�¯é€‰çš„ source å½¢å�‚:被销æ¯�的对象将å�‘出 ResourceWarning。 还为 warnings.WarningMessage å¢žåŠ äº† source 属性。 (由 Victor Stinner 在 bpo-26568 å’Œ bpo-26567 ä¸è´¡çŒ®ã€‚)
当一个 ResourceWarning è¦å‘Šè¢«è®°å…¥æ—¥å¿—时,现在会使用 tracemalloc 模å�—æ�¥å°�试æ��å�–分é…�给已销æ¯�对象的回溯信æ�¯ã€‚
使用 example.py 脚本的示例:
import warnings
def func():
return open(__file__)
f = func()
f = None
命令 python3.6 -Wd -X tracemalloc=5 example.py 的输出:
example.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='example.py' mode='r' encoding='UTF-8'>
f = None
Object allocated at (most recent call first):
File "example.py", lineno 4
return open(__file__)
File "example.py", lineno 6
f = func()
"Object allocated at" 回溯信æ�¯æ˜¯æ–°å¢žçš„并且仅当 tracemalloc 在跟踪 Python 内å˜åˆ†é…�且 warnings 模å�—已被导入时æ‰�会显示。
winreg¶
å¢žåŠ äº† 64 ä½�整数类型 REG_QWORD。 (由 Clement Rouault 在 bpo-23026 ä¸è´¡çŒ®ã€‚)
winsound¶
å…�许将关键å—å�‚æ•°ä¼ ç»™ Beep, MessageBeep å’Œ PlaySound (bpo-27982)。
xmlrpc.client¶
xmlrpc.client 模å�—现在支æŒ�å�� marshall ç”± Apache XML-RPC 的数å—å’Œ None å®žçŽ°æ‰€ä½¿ç”¨çš„é™„åŠ æ•°æ�®ç±»åž‹ã€‚ (由 Serhiy Storchaka 在 bpo-26885 ä¸è´¡çŒ®ã€‚)
zipfile¶
新增的 ZipInfo.from_file() 类方法å…�许基于文件系统ä¸çš„æ–‡ä»¶åˆ›å»º ZipInfo 实例。 新增的 ZipInfo.is_dir() 方法å�¯è¢«ç”¨æ�¥æ£€æµ‹ ZipInfo 实例是å�¦ä»£è¡¨ä¸€ä¸ªç›®å½•。 (由 Thomas Kluyver 在 bpo-26039 ä¸è´¡çŒ®ã€‚)
现在 ZipFile.open() 方法å�¯è¢«ç”¨æ�¥å°†æ•°æ�®å†™å…¥ ZIP 文件,以å�Šæ��å�–æ•°æ�®ã€‚ (由 Thomas Kluyver 在 bpo-26039 ä¸è´¡çŒ®ã€‚)
zlib¶
现在 compress() å’Œ decompress() 函数å�‡å�¯æŽ¥å�—关键å—å�‚数。 (分别由 Aviv Palivoda 在 bpo-26243 以å�Š Xiang Zhang 在 bpo-16764 ä¸è´¡çŒ®ã€‚)
性能优化¶
Python 解释器现在使用 16 ä½�å—代ç �而ä¸�是å—节代ç �,这使得许多æ“�作ç �优化æˆ�为å�¯èƒ½ã€‚ (由 Demur Rumed 在 bpo-26647 å’Œ bpo-28050 ä¸è´¡çŒ®å¹¶å¾—到æ�¥è‡ª Serhiy Storchaka å’Œ Victor Stinner çš„å��助和评估。)
现在
asyncio.Future类已拥有ç»�优化的 C 实现。 (由 Yury Selivanov å’Œ INADA Naoki 在 bpo-26081 ä¸è´¡çŒ®ã€‚)现在
asyncio.Task类已拥有ç»�优化的 C 实现。 (由 Yury Selivanov 在 bpo-28544 ä¸è´¡çŒ®ã€‚)在
typing模å�—ä¸å¤šé¡¹å¯¹å®žçŽ°çš„æ”¹è¿›ï¼ˆå¦‚æ³›åž‹ç±»åž‹çš„ç¼“å˜ï¼‰èŽ·å¾—è‡³å¤š 30 å€�çš„è¿�行效率æ��å�‡å¹¶é™�ä½Žäº†å†…å˜æ¶ˆè€—。现在 ASCII è§£ç �器使用
surrogateescape,ignoreå’Œreplace错误处ç�†å�¥æŸ„æ—¶å�¯æ��速至多 60 å€�。 (由 Victor Stinner 在 bpo-24870 ä¸è´¡çŒ®ã€‚)现在 ASCII å’Œ Latin1 è§£ç �器使用
surrogateescape错误处ç�†å�¥æŸ„æ—¶å�¯æ��速至多 3 å€�。 (由 Victor Stinner 在 bpo-25227 ä¸è´¡çŒ®ã€‚)现在 UTF-8 è§£ç �器使用
ignore,replace,surrogateescape,surrogatepass错误处ç�†å�¥æŸ„æ—¶å�¯æ��速至多 75 å€�。 (由 Victor Stinner 在 bpo-25267 ä¸è´¡çŒ®ã€‚)现在 UTF-8 è§£ç �器使用
ignore,replaceå’Œsurrogateescape错误处ç�†å�¥æŸ„æ—¶å�¯æ��速至多 15 å€�。 (由 Victor Stinner 在 bpo-25301 ä¸è´¡çŒ®ã€‚)现在
bytes % argså�¯æ��速至多 2 å€�。 (由 Victor Stinner 在 bpo-25349 ä¸è´¡çŒ®ã€‚)现在
bytearray % argså�¯æ��速 2.5 至 5 å€�。 (由 Victor Stinner 在 bpo-25399 ä¸è´¡çŒ®ã€‚)优化
bytes.fromhex()å’Œbytearray.fromhex(): 现在它们获得了 2x å’Œ 3.5x çš„æ��速。 (由 Victor Stinner 在 bpo-25401 ä¸è´¡çŒ®ã€‚)优化
bytes.replace(b'', b'.')å’Œbytearray.replace(b'', b'.'): æ��速至多 80%。 (由 Josh Snider 在 bpo-26574 ä¸è´¡çŒ®ã€‚)PyMem_Malloc()域的分é…�器函数 (PYMEM_DOMAIN_MEM) 现在使用 pymalloc å†…å˜ åˆ†é…�器 而ä¸�是 C 库的malloc()函数。 pymalloc 分é…�器针对å°�于ç‰äºŽ 512 å—节的较çŸç”Ÿå‘½å‘¨æœŸå¯¹è±¡è¿›è¡Œäº†ä¼˜åŒ–,而对于较大的内å˜å�—则使用malloc()。 (由 Victor Stinner 在 bpo-26249 ä¸è´¡çŒ®ã€‚)现在
pickle.load()å’Œpickle.loads()在å��åº�列化许多å°�对象时å�¯æ��速多至 10%。 (由 Victor Stinner 在 bpo-27056 ä¸è´¡çŒ®ã€‚)å�‘å‡½æ•°ä¼ å…¥ 关键å—å�‚æ•° ç›¸æ¯”ä¼ å…¥ ä½�ç½®å�‚æ•° 会有é¢�外的开销。 现在对于使用 Argument Clinic 实现的扩展函数æ¤å¼€é”€å·²æ˜¾è‘—é™�低。 (由 Serhiy Storchaka 在 bpo-27574 ä¸è´¡çŒ®ã€‚)
优化了
glob模å�—ä¸çš„glob()å’Œiglob()函数;现在它们å�¯æ��速约 3--6 å€�。 (由 Serhiy Storchaka 在 bpo-25596 ä¸è´¡çŒ®ã€‚)通过使用
os.scandir()优化了pathlibä¸çš„ glob æ“�作;现在它å�¯æ��速约 1.5--4 å€�。 (由 Serhiy Storchaka 在 bpo-26032 ä¸è´¡çŒ®ã€‚)xml.etree.ElementTreeè§£æž�ã€�è¿ä»£å’Œæ·±æ‹·è´�效率已获得显著æ��å�‡ã€‚ (由 Serhiy Storchaka 在 bpo-25638, bpo-25873 å’Œ bpo-25869 ä¸è´¡çŒ®ã€‚)基于 float å’Œ decimal 创建
fractions.Fraction实例现已æ��速 2 至 3 å€�。 (由 Serhiy Storchaka 在 bpo-25971 ä¸è´¡çŒ®ã€‚)
构建和 C API 的改�¶
Python 现在需è¦�åœ¨å·¥å…·é“¾ä¸æ��供一些 C99 支æŒ�æ�¥è¿›è¡Œæž„建 。 最值得注æ„�的是,Python çŽ°åœ¨ä½¿ç”¨æ ‡å‡†çš„æ•´æ•°ç±»åž‹å’Œå®�æ�¥ä»£æ›¿åƒ�
PY_LONG_LONGè¿™æ ·çš„è‡ªå®šä¹‰å®�。 è¦�获å�–更多信æ�¯ï¼Œå�‚è§� PEP 7 å’Œ bpo-17884。使用 Android NDK 和将 Android API 设为 21(Android 5.0 Lollipop)或更高级别的交å�‰ç¼–译 CPython å�¯æˆ�功è¿�行。 虽然 Android 还ä¸�是一个å�—支æŒ�的平å�°ï¼Œä½† Python 测试套件在 Android 模拟器上è¿�行时å�ªæœ‰çº¦ 16 次测试失败。 请å�‚è§� Android meta-issue bpo-26865。
已添åŠ
--enable-optimizationsé…�ç½®æ——æ ‡ 。 打开它将激活 PGO ç‰é«˜æ¶ˆè€—的优化功能。 (原始补ä¸�ç”± Intel çš„ Alecsandru Patrascu 在 bpo-26359 ä¸è´¡çŒ®ã€‚)现当调用
PYMEM_DOMAIN_OBJ(如:PyObject_Malloc()) 和PYMEM_DOMAIN_MEM(如:PyMem_Malloc()) 域的分�器函数时必须�有在 GIL。新增
Py_FinalizeEx()API 用于æ��示缓冲数æ�®çš„刷新是å�¦å¤±è´¥ã€‚ (由 Martin Panter 在 bpo-5319 ä¸è´¡çŒ®ã€‚)PyArg_ParseTupleAndKeywords()现在支æŒ� ä»…é™�ä½�置形å�‚,仅é™�ä½�置形å�‚是ä¸�带å��称定义的。 (由 Serhiy Storchaka 在 bpo-26282 ä¸è´¡çŒ®ã€‚)现在
PyTraceback_Print方法会将由é‡�å¤�行组æˆ�的长åº�列缩写为"[Previous line repeated {count} more times]"。 (由 Emanuel Barry 在 bpo-26823 ä¸è´¡çŒ®ã€‚)新增的
PyErr_SetImportErrorSubclass()函数å…�许指定一个è¦�引å�‘çš„ImportErrorå�类。 (由 Eric Snow 在 bpo-15767 ä¸è´¡çŒ®ã€‚)新增的
PyErr_ResourceWarning()函数å�¯è¢«ç”¨äºŽç”Ÿæˆ�æ��供资æº�分é…�æ�¥æº�çš„ResourceWarning。(由 Victor Stinner 在 bpo-26567 ä¸è´¡çŒ®ã€‚)新增的
PyOS_FSPath()函数å�¯è¿”回一个 path-like object 的文件系统表示形å¼�。 (由 Brett Cannon 在 bpo-27186 ä¸è´¡çŒ®ã€‚)现在
PyUnicode_FSConverter()和PyUnicode_FSDecoder()函数将接� 路径类对象。
其他改进¶
当
--version(简çŸå½¢å¼�:-V) æ��供了两次时,Python 将针对细节信æ�¯æ‰“å�°sys.version。$ ./python -VV Python 3.6.0b4+ (3.6:223967b49e49+, Nov 21 2016, 20:55:04) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
弃用¶
新关键å—¶
ä¸�建议将 async å’Œ await 作为å�˜é‡�ã€�ç±»ã€�函数或模å�—çš„å��称。 它们通过 PEP 492 在 Python 3.5 ä¸è¢«å¼•入,并将在 Python 3.7 æˆ�为ä¿�留关键å—。 从 Python 3.6 开始,使用 async 或 await 作为å��称将会产生 DeprecationWarning。
已弃用的 Python 行为¶
在生æˆ�器内部引å�‘ StopIteration 异常现在将产生 DeprecationWarning,并将在 Python 3.7 ä¸è§¦å�‘ RuntimeError。 详情å�‚è§� PEP 479:更改生æˆ�器内部的 StopIteration 处ç�†ã€‚
现在 __aiter__() 方法应当直接返回一个异æ¥è¿ä»£å™¨è€Œé�žå¦‚之å‰�é‚£æ ·è¿”å›žä¸€ä¸ªå�¯ç‰å¾…对象。 ç»§ç»è¿”回å�¯ç‰å¾…对象将触å�‘ DeprecationWarning。 å�‘下兼容将在 Python 3.7 ä¸è¢«ç§»é™¤ã€‚ (由 Yury Selivanov 在 bpo-27243 ä¸è´¡çŒ®ã€‚)
现在如果一个å��æ–œæ� -å—符对ä¸�是有效的转义åº�列则会产生 DeprecationWarning。 虽然这最终会改为 SyntaxErrorï¼Œä½†åœ¨è¿‘å‡ ä¸ª Python å�‘布版都ä¸�会实施。 (由 Emanuel Barry 在 bpo-27364 ä¸è´¡çŒ®ã€‚)
当执行相对导入时,现在当 __spec__ 或 __package__ 未被定义时从调用方模å�—回退到 __name__ å’Œ __path__ 会引å�‘ ImportWarning。 (由 Rose Ames 在 bpo-25791 ä¸è´¡çŒ®ã€‚)
已弃用的 Python 模��函数和方法¶
asynchat¶
asynchat 已被弃用而应改用 asyncio。 (由 Mariatta 在 bpo-25002 ä¸è´¡çŒ®ã€‚)
asyncore¶
asyncore 已被弃用而应改用 asyncio。 (由 Mariatta 在 bpo-25002 ä¸è´¡çŒ®ã€‚)
dbm¶
与其他 dbm 实现ä¸�å�Œï¼Œdbm.dumb 模å�—会以 'rw' 模å¼�创建数æ�®åº“å¹¶å…�许修改以 'r' 模å¼�打开的数æ�®åº“。 æ¤è¡Œä¸ºçŽ°åœ¨å·²è¢«å¼ƒç”¨å¹¶å°†åœ¨ 3.8 ä¸ç§»é™¤ã€‚ (由 Serhiy Storchaka 在 bpo-21708 ä¸è´¡çŒ®ã€‚)
distutils¶
æœªå†™å…¥æ–‡æ¡£çš„ä¼ ç»™ distutils.Distribution æž„é€ å™¨çš„ extra_path å�‚数现在已被弃用,如果设置将会引å�‘è¦å‘Šã€‚ 未æ�¥çš„ Python å�‘布版将会移除对æ¤å½¢å�‚的支æŒ�。 详情å�‚è§� bpo-27919。
grp¶
在 getgrgid() ä¸å¯¹é�žæ•´æ•°å�‚数的支æŒ�已被弃用。 (由 Serhiy Storchaka 在 bpo-26129 ä¸è´¡çŒ®ã€‚)
importlib¶
现在 importlib.machinery.SourceFileLoader.load_module() å’Œ importlib.machinery.SourcelessFileLoader.load_module() 方法已被弃用。 它们是 importlib ä¸ä»…å˜çš„尚未在之å‰�çš„ Python 版本ä¸è¢«å¼ƒç”¨å¹¶æ”¹ä¸º importlib.abc.Loader.exec_module() çš„ importlib.abc.Loader.load_module() 实现。
现在 importlib.machinery.WindowsRegistryFinder 类已被弃用。 在 3.6.0 ä¸ï¼Œé»˜è®¤å®ƒä»�ä¼šè¢«æ·»åŠ åˆ° sys.meta_path (对于 Windows),但这å�¯èƒ½åœ¨æœªæ�¥å�‘生改å�˜ã€‚
os¶
未写入文档的对于将普通 å—节型对象 作为 os 的函数, compile() å�Šç±»ä¼¼å‡½æ•°ä¸çš„路径的支æŒ�现已被弃用。 (由 Serhiy Storchaka 在 bpo-25791 å’Œ bpo-26754 ä¸è´¡çŒ®ã€‚)
re¶
对于在æ£åˆ™è¡¨è¾¾å¼�ä¸é—´ä½¿ç”¨å†…è�”æ——æ ‡ (?letters) 的支æŒ�已被弃用并将在未æ�¥çš„ Python 版本ä¸ç§»é™¤ã€‚ 在æ£åˆ™è¡¨è¾¾å¼�å¼€å¤´çš„æ——æ ‡ä»�然被å…�许。 (由 Serhiy Storchaka 在 bpo-22493 ä¸è´¡çŒ®ã€‚)
ssl¶
OpenSSL 0.9.8, 1.0.0 和 1.0.1 已被弃用并���支�。 未�的 ssl 模�将至少需� OpenSSL 1.0.2 或 1.1.0。
ftplib, http.client, imaplib, poplib å’Œ smtplib ä¸çš„ SSL 相关å�‚数如 certfile, keyfile å’Œ check_hostname 已被弃用而应改用 context。 (由 Christian Heimes 在 bpo-28022 ä¸è´¡çŒ®ã€‚)
ssl 模å�—ä¸çš„多个å��议和函数现已被弃用。 æŸ�些特性在未æ�¥çš„ OpenSSL 版本ä¸å°†ä¸�å†�å�¯ç”¨ã€‚ å�¦ä¸€äº›ç‰¹æ€§åˆ™å› 建议使用ä¸�å�Œçš„ API 而被弃用。 (由 Christian Heimes 在 bpo-28022 å’Œ bpo-26470 ä¸è´¡çŒ®ã€‚)
tkinter¶
tkinter.tix 模�现已被弃用。 tkinter 用户应当改用 tkinter.ttk。
venv¶
pyvenv 脚本已被弃用而应改用 python3 -m venv。 è¿™å�¯ä»¥é�¿å…� pyvenv 容易混淆所连接的 Python 解释器从而导致弄错虚拟环境所使用的 Python è§£é‡Šå™¨è¿™æ ·çš„é—®é¢˜ã€‚ (由 Brett Cannon 在 bpo-25154 ä¸è´¡çŒ®ã€‚)
xml¶
作为对 DTD 和外部实体检查的缓解,在默认情况下
xml.dom.minidomå’Œxml.sax模å�—å°†ä¸�å†�处ç�†å¤–部实体。 (由 Christian Heimes 在 gh-61441 ä¸è´¡çŒ®ã€‚)
已弃用的 C API 函数和类型¶
未写入文档的函数 PyUnicode_AsEncodedObject(), PyUnicode_AsDecodedObject(), PyUnicode_AsEncodedUnicode() å’Œ PyUnicode_AsDecodedUnicode() 现已被弃用。 请改用 基于泛型编解ç �器的 API。
弃用的构建选项¶
现在 --with-system-ffi é…�ç½®æ——æ ‡åœ¨é�ž macOS UNIX å¹³å�°ä¸Šå°†é»˜è®¤å�¯ç”¨ã€‚ 它å�¯ä»¥é€šè¿‡ --without-system-ffi æ�¥ç¦�ç”¨ï¼Œä½†è¯¥æ——æ ‡å·²è¢«å¼ƒç”¨å¹¶å°†åœ¨ Python 3.7 ä¸ä¸�å†�被接å�—。 macOS ä¸�会å�—æ¤å�˜åŒ–的影å“�。 请注æ„�许多 OS å�‘布方在构建它们的系统 Python æ—¶å·²ç»�使用了 --with-system-ffi æ——æ ‡ã€‚
移除¶
API 与特性的移除¶
æ£åˆ™è¡¨è¾¾å¼�ä¸ç”±
'\'和一个 ASCII å—æ¯�组æˆ�的未知转义åº�列现在将导致报错。 它们在re.sub()的替æ�¢æ¨¡æ�¿ä¸ä»�被å…�许,但已被弃用。 现在re.LOCALEæ——æ ‡å�ªèƒ½ç”¨äºŽäºŒè¿›åˆ¶æ¨¡å¼�。inspect.getmoduleinfo()已被移除(自 CPython 3.3 起已被弃用)。 应当使用inspect.getmodulename()æ�¥èŽ·å�–对应于给定路径的模å�—å��称。 (由 Yury Selivanov 在 bpo-13248 ä¸è´¡çŒ®ã€‚)traceback.Ignore类和traceback.usage,traceback.modname,traceback.fullmodname,traceback.find_lines_from_code,traceback.find_lines,traceback.find_strings,traceback.find_executable_linesç‰æ–¹æ³•已从traceback模å�—ä¸ç§»é™¤ã€‚ 它们是自 Python 3.2 èµ·å�³å·²è¢«å¼ƒç”¨çš„æœªå†™å…¥æ–‡æ¡£çš„æ–¹æ³•å¹¶å�¯é€šè¿‡ç§�有方法使用ç‰ä»·çš„功能。tkinter控件类ä¸çš„tk_menuBar()å’Œtk_bindForTraversal()虚拟方法已被移除(相应的 Tk 命令自 Tk 4.0 èµ·å�³å·²è¿‡æ—¶ï¼‰ã€‚zipfile.ZipFile类的open()方法已ä¸�å†�支æŒ�'U'模å¼�(自 Python 3.4 起已被弃用)。 请使用io.TextIOWrapper以 universal newlines 模å¼�读å�–压缩文本文件。未写入文档的
IN,CDROM,DLFCN,TYPES,CDIOå’ŒSTROPTS模å�—已被移除。 它们在平å�°ä¸“属的Lib/plat-*/目录下å�¯ç”¨ï¼Œä½†æ˜¯æ—©å·²è¿‡æ—¶ï¼Œåœ¨å�„å¹³å�°ä¸Šè®¿é—®æ–¹å¼�ä¸�ä¸€è‡´ï¼Œå¹¶ä¸”æ— äººç»´æŠ¤ã€‚ 创建这些模å�—的脚本ä»�å�¯åœ¨æº�代ç �å�‘布包的 Tools/scripts/h2py.py ä¸èŽ·å�–。已弃用的
asynchat.fifo类现已被移除。
移�到Python 3.6¶
本节列出了先å‰�æ��述的更改以å�Šå�¯èƒ½éœ€è¦�更改代ç �的其他错误修æ£.
 'python' 命令行为的�化¶
带有
COUNT_ALLOCS,SHOW_ALLOC_COUNT或SHOW_TRACK_COUNTå®�定义的特殊 Python 编译版的输出现在默认被关é—。 å�¯ä»¥ä½¿ç”¨-X showalloccount选项é‡�æ–°å�¯ç”¨å®ƒã€‚ 现在它将输出到stderr而ä¸�是stdout。 (由 Serhiy Storchaka 在 bpo-23034 ä¸è´¡çŒ®ã€‚)
Python API 的�化¶
open()å°†ä¸�å†�å…�许组å�ˆä½¿ç”¨'U'模å¼�æ——æ ‡ä¸Ž'+'。 (由 Jeff Balogh å’Œ John O'Connor 在 bpo-2091 ä¸è´¡çŒ®ã€‚)sqlite3å°†ä¸�å†�éš�å¼�地在 DDL è¯å�¥ä¹‹å‰�æ��交未完æˆ�的事务。在 Linux 上,现在
os.urandom()会阻塞直到系统的 urandom ç†µæ± è¢«åˆ�始化以æ��å�‡å®‰å…¨æ€§ã€‚当
importlib.abc.Loader.exec_module()被定义时,importlib.abc.Loader.create_module()也必须被定义。现在
PyErr_SetImportError()当其 msg å�‚数未被设置时将设置TypeError。 在之å‰�版本ä¸ä»…返回NULL。代ç �对象的
co_lnotabå±žæ€§çš„æ ¼å¼�被修改为支æŒ�负行å�·å·®å€¼ã€‚ 在默认情况下,Python ä¸�会输出具有负行å�·å·®å€¼çš„å—节ç �。 使用frame.f_linenoã€�PyFrame_GetLineNumber()或PyCode_Addr2Line()的函数将ä¸�å�—å½±å“�。 直接解ç �:attr:!co_lnotab 的函数应当被更新以便为行å�·å·®å€¼ä½¿ç”¨æœ‰ç¬¦å�·çš„ 8 ä½�整数类型,但这å�ªæ˜¯å¯¹æ”¯æŒ�使用负行å�·å·®å€¼çš„应用程åº�çš„è¦�求。 有关co_lnotabæ ¼å¼�以å�Šå¦‚何对其进行解ç �的详情å�‚è§�Objects/lnotab_notes.txt,相关的ç�†ç”±å�‚è§� PEP 511。现在
compileall模å�—ä¸çš„函数将返回布尔值而ä¸�是1或0æ�¥åˆ†åˆ«è¡¨ç¤ºæˆ�功或失败。 由于布尔值是整数的å�类,这应当å�ªæœ‰åœ¨ä½ 对1或0æ‰§è¡Œæ ‡è¯†å�·æ£€æµ‹æ—¶æ‰�会出现问题。 å�‚è§� bpo-25768。现在读å�–
urllib.parse.urlsplit()和urlparse()结果的port属性对于超出范围的值将引�ValueError,而�是返回None。 �� bpo-20059。imp模�现在将引�DeprecationWarning而�是PendingDeprecationWarning。下列模�在其
__all__å±žæ€§ä¸æ·»åŠ äº†ç¼ºå¤±çš„ API 以匹é…�已写入文档的 API:calendar,cgi,csv,ElementTree,enum,fileinput,ftplib,logging,mailbox,mimetypes,optparse,plistlib,smtpd,subprocess,tarfile,threadingå’Œwave。 è¿™æ„�味ç�€å½“使用import *时它们将会导出新的符å�·ã€‚ (由 Joel Taddei å’Œ Jacek KoÅ‚odziej 在 bpo-23883 ä¸è´¡çŒ®ã€‚)当执行相对导入时,如果
__package__与__spec__.parent的比较结果ä¸�相ç‰åˆ™ä¼šå¼•å�‘ImportWarning。 (由 Brett Cannon 在 bpo-25791 ä¸è´¡çŒ®ã€‚)当执行相对导入而上级包未知时,则会引å�‘
ImportError。 在之å‰�版本ä¸ï¼Œå�¯èƒ½ä¼šå¼•å�‘SystemError。 (由 Brett Cannon 在 bpo-18018 ä¸è´¡çŒ®ã€‚)基于
socketserver模å�—çš„æœ�务器,包括在http.server,xmlrpc.serverå’Œwsgiref.simple_server定义的æœ�务器,现在将å�ªæ�•获派生自Exception的异常。 å› æ¤å¦‚果一个请求处ç�†å�¥æŸ„引å�‘了SystemExit或KeyboardInterrupt之类的异常,handle_error()ä¸�å†�会被调用,异常将会å�œæ¢å�•线程的æœ�务器。 (由 Martin Panter 在 bpo-23430 ä¸è´¡çŒ®ã€‚)如果用户没有æ�ƒé™�,
spwd.getspnam()现在会抛出PermissionError而�之�的KeyError。现在
socket.socket.close()方法当下层系统调用报告错误 (例如EBADF) 时将会引å�‘一个异常。 (由 Martin Panter 在 bpo-26685 ä¸è´¡çŒ®ã€‚)现在
smtpd.SMTPChannelå’Œsmtpd.SMTPServeræž„é€ å™¨çš„ decode_data å�‚数默认为False。 è¿™æ„�味ç�€ä¼ ç»™process_message()çš„å�‚数现在默认为å—节串对象,而process_message()å°†è¢«ä¼ å…¥å…³é”®å—å�‚数。 å·²æ ¹æ�® 3.5 所生æˆ�的弃用è¦å‘Šè¿›è¡Œæ›´æ–°çš„代ç �å°†ä¸�会å�—到影å“�。现在
json模å�—ä¸dump(),dumps(),load()å’Œloads()函数以å�ŠJSONEncoderå’ŒJSONDecoderç±»æž„é€ å™¨çš„æ‰€æœ‰å�¯é€‰å�‚数都是 ä»…é™�关键å—å�‚数。 (由 Serhiy Storchaka 在 bpo-18726 ä¸è´¡çŒ®ã€‚)typeçš„å�类如果未é‡�è½½type.__new__,将ä¸�å†�能使用一个å�‚数的形å¼�æ�¥èŽ·å�–对象的类型。作为 PEP 487 çš„ä¸€éƒ¨åˆ†ï¼Œå¯¹ä¼ é€’ç»™
type的关键å—å�‚数的处ç�†ï¼ˆå…ƒç±»æ��示metaclass除外)现在统一委托给object.__init_subclass__()。 è¿™æ„�味ç�€type.__new__()å’Œtype.__init__()现在都接å�—ä»»æ„�的关键å—å�‚数,但object.__init_subclass__()(从type.__new__()调用)默认将拒ç»�它们。 接å�—é¢�外关键å—å�‚数的自定义元类需è¦�相应调整对type.__new__()çš„è°ƒç”¨ï¼ˆæ— è®ºæ˜¯ç›´æŽ¥è°ƒç”¨è¿˜æ˜¯é€šè¿‡super间接调用)。在
distutils.command.sdist.sdistä¸ï¼Œdefault_format属性已被移除而ä¸�å†�被使用。 作为代替,在所有平å�°ä¸Šï¼Œå¸¦ gzip çš„ tarfile æ ¼å¼�都是默认的而ä¸�会针对特定平å�°è¿›è¡Œé€‰æ‹©ã€‚ 在å�‘行版基于 Windows 构建且需è¦� zip å�‘行版的环境ä¸ï¼Œè¯·ä½¿ç”¨åŒ…å�«ä»¥ä¸‹å†…容的setup.cfg文件æ�¥é…�置项目:[sdist] formats=zip
æ¤è¡Œä¸ºå·²é€šè¿‡ Setuptools 26.0.0 å��å�‘ç§»æ¤�到更早的 Python 版本ä¸ã€‚
在
urllib.request模å�—å’Œhttp.client.HTTPConnection.request()方法ä¸ï¼Œå¦‚果没有指定 Content-Length æ ‡å¤´å—æ®µå¹¶ä¸”请求体是一个文件对象,现在它将使用 HTTP 1.1 分å�—ç¼–ç �æ ¼å¼�å�‘é€�。 如果必须è¦�将一个文件对象å�‘é€�ç»™ HTTP 1.0 æœ�务器,那么现在必须由调用方指定 Content-Length 值。 (由 Demian Brecht å’Œ Rolf Krahl 在 bpo-12319 ä¸è´¡çŒ®å¹¶ç”± Martin Panter 进行修改。)现在
DictReader将返回类型为OrderedDict的行。 (由 Steve Holden 在 bpo-27842 ä¸è´¡çŒ®ã€‚)crypt.METHOD_CRYPT如果ä¸�å�—å¹³å�°æ”¯æŒ�å°†ä¸�å†�è¢«æ·»åŠ åˆ°crypt.methods。 (由 Victor Stinner 在 bpo-25287 ä¸è´¡çŒ®ã€‚)namedtuple()çš„ verbose å’Œ rename å�‚数现在是仅é™�关键å—å�‚数。 (由 Raymond Hettinger 在 bpo-25628 ä¸è´¡çŒ®ã€‚)在 Linux 上,
ctypes.util.find_library()现在会到LD_LIBRARY_PATH䏿Ÿ¥æ‰¾å…±äº«åº“。 (由 Vinay Sajip 在 bpo-9998 ä¸è´¡çŒ®ã€‚)imaplib.IMAP4类现在å�¯ä»¥å¤„ç�†æœ�务器å�‘é€�的消æ�¯ä¸åŒ…å�«']'å—ç¬¦çš„æ——æ ‡ï¼Œä»¥æ”¹å–„åœ¨çŽ°å®žä¸–ç•Œä¸çš„兼容性。 (由 Lita Cho 在 bpo-21815 ä¸è´¡çŒ®ã€‚)现在
mmap.write()函数将åƒ�å…¶ä»–å†™å…¥æ–¹æ³•ä¸€æ ·è¿”å›žå†™å…¥çš„å—节数。 (由 Jakub Stasiak 在 bpo-26335 ä¸è´¡çŒ®ã€‚)现在
pkgutil.iter_modules()å’Œpkgutil.walk_packages()函数将返回ModuleInfoå…·å��元组。 (由 Ramchandra Apte 在 bpo-17211 ä¸è´¡çŒ®ã€‚)现在
re.sub()å�³ä½¿æœªåœ¨å—ç¬¦ä¸²ä¸æ‰¾åˆ°æ¨¡å¼�也会针对替æ�¢æ¨¡æ�¿ä¸æ— 效的数å—分组引用引å�‘错误。 é’ˆå¯¹æ— æ•ˆåˆ†ç»„å¼•ç”¨çš„é”™è¯¯æ¶ˆæ�¯çŽ°åœ¨å°†åŒ…æ‹¬åˆ†ç»„ç´¢å¼•å’Œå¼•ç”¨ä½�置。 (由 SilentGhost, Serhiy Storchaka 在 bpo-25953 ä¸è´¡çŒ®ã€‚)现在
zipfile.ZipFileå¯¹äºŽæ— æ³•è¯†åˆ«çš„åŽ‹ç¼©å€¼å°†å¼•å�‘NotImplementedError。 在之å‰�ç‰ˆæœ¬ä¸æ˜¯å¼•å�‘简å�•çš„RuntimeError。 æ¤å¤–,在已关é—çš„ ZipFile 上调用ZipFile或者在使用'r'模å¼�创建的 ZipFile 上调用write()将引å�‘ValueError。 在之å‰�版本ä¸ï¼Œå¯¹äºŽè¿™äº›åœºæ™¯æ˜¯å¼•å�‘RuntimeError。当自定义元类与零å�‚æ•°çš„
super()或从方法到éš�å¼�çš„__class__é—包å�˜é‡�的直接引用相结å�ˆæ—¶ï¼Œéš�å¼�çš„__classcell__命å��空间æ�¡ç›®çŽ°åœ¨å¿…é¡»ä¼ åˆ°type.__new__进行åˆ�始化。 如果ä¸�è¿™æ ·å�šé‚£ä¹ˆåœ¨ Python 3.6 ä¸å°†ä¼šå¯¼è‡´DeprecationWarning而在 Python 3.8 ä¸å°†ä¼šå¯¼è‡´RuntimeError。With the introduction of
ModuleNotFoundError, import system consumers may start expecting import system replacements to raise that more specific exception when appropriate, rather than the less-specificImportError. To provide future compatibility with such consumers, implementors of alternative import systems that completely replace__import__()will need to update their implementations to raise the new subclass when a module can't be found at all. Implementors of compliant plugins to the default import system shouldn't need to make any changes, as the default import system will raise the new subclass when appropriate.
C API 的�化¶
现在
PyMem_Malloc()分é…�器æ—�将使用 pymalloc 分é…�器 而ä¸�是系统malloc()。 调用PyMem_Malloc()时未æŒ�有 GIL 的应用程åº�现在å�¯èƒ½å�‘生崩溃。 请将PYTHONMALLOC环境å�˜é‡�设为debugä»¥ä¾¿åœ¨ä½ çš„åº”ç”¨ç¨‹åº�ä¸éªŒè¯�内å˜åˆ†é…�器的使用。 å�‚è§� bpo-26249。现在如果缓冲数æ�®åˆ·æ–°å¤±è´¥
Py_Exit()(以�主解释器) 会将退出状��写为 120。 �� bpo-5319。
CPython å—节ç �的改å�˜Â¶
在 Python 3.6 ä¸å¯¹ bytecode 进行了一些é‡�大修改。
Python 解释器现在使用 16 ä½�å—代ç �而ä¸�是å—节代ç �。 (由 Demur Rumed 在 bpo-26647 å’Œ bpo-28050 ä¸è´¡çŒ®å¹¶å¾—到æ�¥è‡ª Serhiy Storchaka å’Œ Victor Stinner çš„å��助和评估。)
新增
FORMAT_VALUEå’ŒBUILD_STRINGæ“�作ç �作为 æ ¼å¼�化å—符串å—é�¢å€¼ 实现的组æˆ�部分。 (由 Eric Smith 在 bpo-25483 以å�Š Serhiy Storchaka 在 bpo-27078 ä¸è´¡çŒ®ã€‚)新增的
BUILD_CONST_KEY_MAPæ“�作ç �用于优化具有常é‡�键的å—典的创建。 (由 Serhiy Storchaka 在 bpo-27140 ä¸åˆ›å»ºã€‚)函数调用æ“�作ç �进行了大幅改进以æ��å�‡æ•ˆçŽ‡å¹¶ç®€åŒ–å®žçŽ°ã€‚
MAKE_FUNCTION,CALL_FUNCTION,CALL_FUNCTION_KWå’ŒBUILD_MAP_UNPACK_WITH_CALLæ“�作ç �已被修改,新增了CALL_FUNCTION_EXå’ŒBUILD_TUPLE_UNPACK_WITH_CALL,并移除了CALL_FUNCTION_VAR,CALL_FUNCTION_VAR_KWå’ŒMAKE_CLOSUREæ“�作ç �。 (由 Demur Rumed 在 bpo-27095 ä¸ï¼Œä»¥å�Š Serhiy Storchaka 在 bpo-27213, bpo-28257 ä¸è´¡çŒ®ã€‚)新增了
SETUP_ANNOTATIONSå’ŒSTORE_ANNOTATIONæ“�作ç �以支æŒ�æ–°çš„ variable annotation è¯æ³•。 (由 Ivan Levkivskyi 在 bpo-27985 ä¸è´¡çŒ®ã€‚)
Python 3.6.2 ä¸çš„é‡�è¦�å�˜åŒ–¶
新增 make regen-all æž„å»ºç›®æ ‡Â¶
为了简化交å�‰ç¼–译,并确ä¿� CPython 能够å�¯é� 地编译而ä¸�需è¦�å·²å˜åœ¨å�¯ç”¨çš„ Python 版本,基于 autotools 的构建系统将ä¸�å†�å°�è¯•æ ¹æ�®æ–‡ä»¶ä¿®æ”¹æ—¶é—´éš�å¼�地é‡�新编译已生æˆ�的文件。
�而代之的是,新增了一个 make regen-all 命令以便在需�时强制�新生�这些文件(例如在基于预生�版本构建了 Python 的�始版本之�)。
还定义了其他一些更具选择性的é‡�生æˆ�ç›®æ ‡ —— 详情å�‚è§� Makefile.pre.in。
(由 Victor Stinner 在 bpo-23404 ä¸è´¡çŒ®ã€‚)
在 3.6.2 ç‰ˆæœ¬åŠ å…¥.
移除了 make touch æž„å»ºç›®æ ‡Â¶
之å‰�用于通过更新生æˆ�文件的修改时间æ�¥è¯·æ±‚éš�å¼�çš„é‡�新生æˆ�这些文件的 make touch æž„å»ºç›®æ ‡å·²è¢«ç§»é™¤ã€‚
它已被新的 make regen-all ç›®æ ‡æ‰€æ›¿ä»£ã€‚
(由 Victor Stinner 在 bpo-23404 ä¸è´¡çŒ®ã€‚)
在 3.6.2 版本�生�更.
Python 3.6.4 ä¸çš„é‡�è¦�å�˜åŒ–¶
曾ç»�作为 API 一部分的 PyExc_RecursionErrorInst å�•ä¾‹å·²è¢«ç§»é™¤ï¼Œå› ä¸ºå®ƒçš„æˆ�员永远ä¸�会被清ç�†ï¼Œå�¯èƒ½åœ¨è§£é‡Šå™¨çš„æœ€ç»ˆåŒ–过程ä¸å¯¼è‡´æ®µé”™è¯¯ã€‚ (由 Xavier de Gaye 在 bpo-22898 å’Œ bpo-30697 ä¸è´¡çŒ®ã€‚)
Python 3.6.5 ä¸çš„é‡�è¦�å�˜åŒ–¶
在æŸ�些情况下 locale.localeconv() 函数现在会临时将 LC_CTYPE è¯è¨€åŒºåŸŸè®¾ä¸º LC_NUMERIC è¯è¨€åŒºåŸŸã€‚ (由 Victor Stinner 在 bpo-31900 ä¸è´¡çŒ®ã€‚)
Python 3.6.7 ä¸çš„é‡�è¦�å�˜åŒ–¶
在默认情况下 xml.dom.minidom 和 xml.sax 模�将��处�外部实例。 �请�阅 gh-61441。
在 3.6.7 ä¸å½“æ��ä¾›ä¸�带末尾æ�¢è¡Œç¬¦çš„输入时 tokenize 模å�—现在会éš�å¼�地å�‘出 NEWLINE 形符。 æ¤è¡Œä¸ºçŽ°åœ¨å·²ä¸Ž C 分è¯�器的内部行为相匹é…�。 (由 Ammar Askar 在 bpo-33899 ä¸è´¡çŒ®ã€‚)
Python 3.6.10 ä¸çš„é‡�è¦�å�˜åŒ–¶
出于é‡�è¦�的安全性考é‡�,asyncio.loop.create_datagram_endpoint() çš„ reuse_address å½¢å�‚ä¸�å†�被支æŒ�。 这是由 UDP ä¸çš„套接å—选项 SO_REUSEADDR 的行为导致的。 更多细节请å�‚阅 loop.create_datagram_endpoint() 的文档。 (由 Kyle Stanley, Antoine Pitrou å’Œ Yury Selivanov 在 bpo-37228 ä¸è´¡çŒ®ã€‚。)
Python 3.6.13 ä¸çš„é‡�è¦�å�˜åŒ–¶
早先的 Python 版本å…�许使用 ; å’Œ & 作为 urllib.parse.parse_qs() å’Œ urllib.parse.parse_qsl() ä¸ query å½¢å�‚的分隔键。 出于安全考虑,也为了é�µå¾ªæ›´æ–°çš„ W3C 推è��设置,这已被改为å�ªå…�许å�•个分隔键,默认为 &。 这一改å�˜è¿˜ä¼šå½±å“� cgi.parse() å’Œ cgi.parse_multipart() å› ä¸ºå®ƒä»¬åœ¨å†…éƒ¨ä½¿ç”¨äº†å�—å½±å“�的函数。 è¦�了解更多细节,请查看它们å�„自的文档。 (由 Adam Goldschmidt, Senthil Kumaran å’Œ Ken Jin 在 bpo-42967 ä¸è´¡çŒ®ã€‚)
Python 3.6.14 ä¸çš„é‡�è¦�å�˜åŒ–¶
新的安全修æ£å°† ftplib.FTP 的行为改æˆ�当设置被动数æ�®é€šé�“æ—¶ä¸�信任远程æœ�务器所å�‘é€�çš„ IPv4 地å�€ã€‚ 我们会改为é‡�用 ftp æœ�务器的 IP 地å�€ã€‚ 对于需è¦�原先的行为的ä¸�常è§�代ç �ï¼Œè¯·åœ¨ä½ çš„ FTP 实例上将 trust_server_pasv_ipv4_address 属性设为 True。 (å�‚è§� gh-87451。)
在 URL ä¸å˜åœ¨æ�¢è¡Œç¬¦æˆ–制表符å�¯èƒ½ä¼šå¯¼è‡´æŸ�ç§�å½¢å¼�的攻击。 æ ¹æ�®æ›´æ–°äº† RFC 3986 çš„ WHATWG 规范,解æž�器 urllib.parse() 将从 URL ä¸å޻除 ASCII æ�¢è¡Œç¬¦ \n, \r 和制表符 \t 以防æ¢è¿™ç§�攻击。 移除的å—符将由一个新的模å�—层级å�˜é‡� urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE æ�¥æŽ§åˆ¶ã€‚ (å�‚è§� gh-88048。)