Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

Python 增强提案

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的计划

  • PEP 238(更改除法运算符)
  • PEP 328(导入:多行和绝对/相对)
  • PEP 343(“with”语句)
  • PEP 352(异常所需的超类)

样式变更

  • 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];还有 TrueFalse [已完成]
  • ... 成为通用表达式元素 [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。 [已完成]

待移除

  • basestring.find()basestring.rfind();在 try/except 块中使用 basestring.index()basestring.[r]partition()basestring.rindex()??? [13] [不太可能]
  • file.xreadlines() 方法 [31] [已完成]
  • dict.setdefault()[15] [不太可能]
  • dict.has_key() 方法;使用 in 运算符 [已完成]
  • list.sort()builtin.sorted() 方法:消除 cmp 参数 [27] [已完成]

内置命名空间

  • 在适当的情况下使内置函数返回迭代器(例如 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.isCallablecallable() 内置函数将被移除 [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

最后修改:2025-02-01 08:55:40 GMT