PEP 3100 – Python 3.0 杂项计划
- 作者:
- Brett Cannon <brett at python.org>
- 状态:
- 最终
- 类型:
- 流程
- 创建:
- 20-Aug-2004
- 历史记录:
摘要
本 PEP(以前称为 PEP 3000)描述了针对 Python 3000 的一些小规模变更和新功能,这些变更和新功能尚未单独编写 PEP。
本文件中包含的功能列表可能会发生变化,并且对 Python 开发社区没有约束力;功能可能会随时添加、删除和修改。此列表的目的是将我们的语言开发工作集中在 3.0 的变更步骤上,并鼓励人们找到方法来简化过渡。
本文件不是任何人都可以扩展的愿望清单。虽然本 PEP 有两位作者,但我们只是提供文本;本文件中列出哪些变更的决定由 Guido van Rossum 做出,他已将这些变更作为 Python 3.0 的目标。
Guido 关于 Python 3.0 中不会改变的事项的声明记录在 PEP 3099 中。
总体目标
一个总体目标是通过删除旧的做事方式来减少功能重复。设计的总体原则是,一种明显的做事方式就足够了。 [1]
影响 PEP
样式变更
- C 风格指南将更新为使用 4 个空格缩进,绝不使用制表符。此样式应用于所有新文件;现有文件仅在永远无法从 Python 2 HEAD 合并特定文件时才能更新。在一个文件中,缩进样式应保持一致。目前没有计划进行其他样式指南变更。
核心语言
- 真除法成为默认行为 PEP 238 [已完成]
exec
作为语句不值得 - 将其改为函数 [已完成]- 添加静态类型的可选声明 PEP 3107 [10] [已完成]
- 仅支持新式类;经典类将被移除 [1] [已完成]
- 用函数替换
print
[14] PEP 3105 [已完成] - 文件的
softspace
属性将被移除。[已完成] - 如果需要错误变量,请使用
except E1, E2, E3 as err:
。 [3] [已完成] None
成为关键字 [4];还有True
和False
[已完成]...
成为通用的表达式元素 [16] [已完成]as
成为关键字 [5](从 2.6 开始已完成)[已完成]- 让列表推导成为将等效的生成器表达式传递给
list()
的语法糖;结果是循环变量将不再被公开 PEP 289 [已完成] - 除非类型明确支持,否则不同类型之间的比较(除了
==
和!=
)将引发异常 [6] [已完成] - 在浮点数意外被接受的操作(PyArg_ParseTuple() i & l 格式)中,浮点数将不被接受作为整数的替代参数。
- 在函数作用域中移除 from … import *。[已完成] 这意味着函数始终可以被优化,并且对未优化函数的支持可以被移除。
- 导入 PEP 328
- 导入默认情况下将是绝对的。[已完成]
- 必须显式指定相对导入。[已完成]
- 不支持
sys.modules
中的间接条目(即,A.string
的值为None
表示使用顶层string
模块)。
- __init__.py 在子包中可能会变为可选?__init__.py 仍然需要用于顶层包。
- 清理 Py_InitModule() 变体 {,3,4}(还有导入和解析器 API)
- 清理 pythonrun 等中导出的 API。
- 某些表达式将需要在 2.x 中不需要的括号。
- 列表推导需要在可迭代对象周围加上括号。这将使列表推导更类似于生成器推导。[x for x in 1, 2] 需要写成: [x for x in (1, 2)] [已完成]
- 可能需要对 lambda 函数加上括号 PEP 308 [不]
- 为了消除 __builtin__ 和 __builtins__ 之间的混淆,决定将 __builtin__(模块)重命名为 builtins,并保留 __builtins__(沙箱钩子)。 [33] [34] [已完成]
- 函数上的形如
func_whatever
的属性将被重命名为__whatever__
[17] [已完成] - 集合字面量和推导 [19] [20] [已完成] {x} 表示 set([x]);{x, y} 表示 set([x, y])。{F(x) for x in S if P(x)} 表示 set(F(x) for x in S if P(x))。注意,{range(x)} 表示 set([range(x)]),而不是 set(range(x))。没有空集合的字面量;请使用 set()(或 {1}&{2} :-)。没有 frozenset 字面量;它们很少需要。
- __nonzero__ 特殊方法将被重命名为 __bool__,并且必须返回布尔值。类型对象槽将被称为 tp_bool [23] [已完成]
- 字典推导,如 PEP 274 中首次提出 [已完成] {K(x): V(x) for x in S if P(x)} 表示 dict((K(x), V(x)) for x in S if P(x))。
将被移除
- 字符串异常:使用 Exception 类的实例 [2] [已完成]
raise Exception, "message"
:使用raise Exception("message")
[12] [已完成]x
:使用repr(x)
[2] [已完成]<>
运算符:使用!=
代替 [3] [已完成]- 浮点数上的 __mod__ 和 __divmod__ 特殊方法。[它们应该保留] [21]
- 删除未绑定方法 [7] [26] [已完成]
- METH_OLDARGS [已完成]
- WITH_CYCLE_GC [已完成]
- __getslice__、__setslice__、__delslice__ [32];删除切片操作码并使用切片对象。[已完成]
__oct__
、__hex__
:在oct()
和hex()
中使用__index__
代替。[已完成]__methods__
和__members__
[已完成]- C API(参见代码):PyFloat_AsString、PyFloat_AsReprString、PyFloat_AsStringEx、PySequence_In、PyEval_EvalFrame、PyEval_CallObject、_PyObject_Del、_PyObject_GC_Del、_PyObject_GC_Track、_PyObject_GC_UnTrack PyString_AsEncodedString、PyString_AsDecodedString PyArg_NoArgs、PyArg_GetInt、intargfunc、intintargfunc
PyImport_ReloadModule?
原子类型
- 删除 int 和 long 类型的区别;“long” 内置类型和带“L”或“l”后缀的字面量将消失 [1] [已完成]
- 使所有字符串都成为 Unicode,并具有单独的 bytes() 类型 [1] 新字符串类型将被称为“str”。请参见 PEP 3137。[已完成]
- 在适当的情况下返回可迭代视图,而不是列表,用于原子类型的操作(例如
dict.keys()
、dict.values()
、dict.items()
等);iter* 方法将被移除。[已完成] - 使
string.join()
对其参数进行字符串化? [18] [不] - 修复 open(),使其在模式错误时返回 ValueError 而不是 IOError。[已完成]
将被移除
内置命名空间
- 使内置函数在适当的情况下返回迭代器(例如
range()
、zip()
、map()
、filter()
等) [已完成] - 移除
input()
并将raw_input()
重命名为input()
。如果您需要旧的 input(),请使用 eval(input())。 [已完成] - 引入
trunc()
,它将调用其参数上的__trunc__()
方法;建议用于像 float 这样的对象,其中调用__int__()
会导致数据丢失,但仍然需要整数表示?[8] [已完成] - 异常层次结构更改 PEP 352 [已完成]
- 添加一个
bin()
函数,用于整数的二进制表示形式 [已完成]
将被移除
apply()
:使用f(*args, **kw)
代替 [2] [已完成]buffer()
:必须删除(使用 bytes() 类型代替) (?) [2] [已完成]callable()
:直接使用 isinstance(x, collections.Callable) (?) [2] [已完成]compile()
:放在sys
中(或者可能放在它自己的模块中) [2]coerce()
:不再需要 [2] [已完成]execfile()
、reload()
:使用exec()
[2] [已完成]intern()
:放在sys
中 [2]、[22] [已完成]reduce()
:放在functools
中,循环在大多数情况下更易读 [2]、[9] [已完成]xrange()
:使用range()
代替 [1] [参见上面的 range()] [已完成]StandardError
:这是原始异常层次结构的遗留物;- 改用子类化
Exception
。 [已完成]
标准库
- 重新组织标准库,使其不那么浅?
- 将测试代码移到其所属的位置,标准库中将不再有 test() 函数
- 将所有测试转换为使用 doctest 或 unittest。
- 有关标准库改进流程,请参见 PEP 3001
将被移除
- sets 模块。 [已完成]
- 要删除的 stdlib 模块
- 请参见源代码中的文档字符串和注释
macfs
[待办事项]new
、reconvert
、stringold
、xmllib
、pcre
、pypcre
、strop
[全部已完成]
- 请参见 PEP 4
buildtools
、mimetools
、multifile
、rfc822
[待办事项]mpz
、posixfile
、regsub
、rgbimage
、sha
、statcache
、sv
、TERMIOS
、timing
[已完成]cfmfile
、gopherlib
、md5
、MimeWriter
、mimify
[已完成]cl
、sets
、xreadlines
、rotor
、whrandom
[已完成]
- lib-old 中的所有内容 PEP 4 [已完成]
Para
、addpack
、cmp
、cmpcache
、codehack
、dircmp
、dump
、find
、fmt
、grep
、lockfile
、newdir
、ni
、packmail
、poly
、rand
、statcache
、tb
、tzparse
、util
、whatsound
、whrandom
、zmod
sys.exitfunc
:改用 atexit 模块 [28]、[35] [已完成]sys.exc_type
、sys.exc_values
、sys.exc_traceback
:不是线程安全的;使用sys.exc_info()
或异常的属性 [2] [11] [28] [已完成]sys.exc_clear
:Python 3 的 except 语句提供了相同的功能 [24] PEP 3110 [28] [已完成]array.read
、array.write
[30]operator.isCallable
:正在删除callable()
内置函数 [29] [36] [已完成]operator.sequenceIncludes
:由于operator.contains
而变得冗余 [29] [36] [已完成]- 在 thread 模块中,锁定对象上的 acquire() 和 release() 方法的 acquire_lock() 和 release_lock() 别名。(可能也应该将 thread 模块作为公共 API 删除,改为始终使用 threading.py。)
- UserXyz 类,改为 XyzMixins。
- 从 Queue.py 中删除不可靠的 empty() 和 full() 方法?[25]
- 从 random API 中删除 jumpahead()?[25]
- 将随机数的基元改为生成随机字节而不是随机浮点数?[25]
- 摆脱 Cookie.SerialCookie 和 Cookie.SmartCookie?[25]
- 修改 heapq.heapreplace() API,将新值与堆顶进行比较?[25]
待解决问题
- 要求使用 C99,这样我们就可以使用 // 注释、命名初始化器、在不引入新范围的情况下声明变量,以及其他优点。(以及更好地支持 IEEE 浮点数问题,例如 NaN 和无穷大?)
- 删除对旧系统的支持,包括:BeOS、RISCOS、(SGI)Irix、Tru64
参考资料
版权
本文件已置于公有领域。
来源:https://github.com/python/peps/blob/main/peps/pep-3100.rst
最后修改时间:2023-09-09 17:39:29 GMT