PEP 3100 – Python 3.0 杂项计划
- 作者:
- Brett Cannon <brett at python.org>
- 状态:
- 最终版
- 类型:
- 流程
- 创建日期:
- 2004年8月20日
- 发布历史:
摘要
此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)] [已完成]
- Lambdas 可能必须加括号 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__,并且必须返回一个布尔值。typeobject 槽将命名为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))。
待移除
- 字符串异常:使用异常类实例 [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 模块。 [已完成]
- 待移除的标准库模块
- 参见源代码中的文档字符串和注释
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