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>
状态:
最终
类型:
流程
创建:
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

  • 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)] [已完成]
    • 可能需要对 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。[已完成]

将被移除

  • 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 模块。 [已完成]
  • 要删除的 stdlib 模块
    • 请参见源代码中的文档字符串和注释
      • macfs [待办事项]
      • newreconvertstringoldxmllibpcrepypcrestrop [全部已完成]
    • 请参见 PEP 4
      • buildtoolsmimetoolsmultifilerfc822 [待办事项]
      • mpzposixfileregsubrgbimageshastatcachesvTERMIOStiming [已完成]
      • cfmfilegopherlibmd5MimeWritermimify [已完成]
      • clsetsxreadlinesrotorwhrandom [已完成]
    • lib-old 中的所有内容 PEP 4 [已完成]
      • Paraaddpackcmpcmpcachecodehackdircmpdumpfindfmtgreplockfilenewdirnipackmailpolyrandstatcachetbtzparseutilwhatsoundwhrandomzmod
  • sys.exitfunc:改用 atexit 模块 [28][35] [已完成]
  • sys.exc_typesys.exc_valuessys.exc_traceback:不是线程安全的;使用 sys.exc_info() 或异常的属性 [2] [11] [28] [已完成]
  • sys.exc_clear:Python 3 的 except 语句提供了相同的功能 [24] PEP 3110 [28] [已完成]
  • array.readarray.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