编译器现在生成一个SyntaxWarning 何时身份检查 与某些类型的文字(例如字符串,整数)一起使用。这些通常可以在CPython 中偶然使用,但不受语言规范的保证。警告建议用户使用相等测试。
Python API的变化
-
该函数platform.popen() 已被删除,自Python 3.3以来已被弃用:os.popen()改为使用。
-
statistics.mode() 给定多模态数据时,该函数不再引发异常。相反,它返回输入数据中遇到的第一个模式。
该类的selection() 方法 tkinter.ttk.Treeview 不再需要参数。在Python 3.6中不推荐使用带有参数来更改选择。使用专门的方法,如selection_set() 更改选择。
-
writexml(),toxml()并且toprettyxml()所述的方法 xml.dom.minidom模块,和xml.etree现在保存由用户指定的属性顺序。(
-dbm.dumb使用flags打开的数据库'r'现在是只读的。 dbm.dumb.open()带有标志'r','w'如果不存在则不再创建数据库。
-
将不再调用doctype() 子类中定义的方法, XMLParser 并且将导致发出a RuntimeWarning而不是a DeprecationWarning 。doctype() 在目标上定义用于处理XML doctype声明的方法。
-
一个RuntimeError是现在时引发自定义的元类不提供classcell__传入的名称空间项 type.__new。A DeprecationWarning是在Python 3.6-3.7中发出的。
-
在cProfile.Profile类现在可以作为一个上下文管理器。
-
shutil.copyfile() ,shutil.copy() ,shutil.copy2() , shutil.copytree() 并shutil.move() 使用特定于平台的“快速复制”的系统调用
-
shutil.copyfile() Windows上的默认缓冲区大小从16 KiB更改为1 MiB。
-
PyGC_Head 结构完全改变了。触及struct 成员的所有代码都应该被重写。
-
PyInterpreterState 结构已被移入“内部”头文件(特别是Include / internal / pycore_pystate.h)。opaque PyInterpreterState 仍然可用作公共API(和稳定的ABI)的一部分。文档表明struct的字段都不公开,所以我们希望没有人使用它们。但是,如果您确实依赖于一个或多个私有字段而没有其他选择,那么请打开一个BPO问题。我们将努力帮助您进行调整(可能包括向公共API添加访问器功能)。
-
ASYNCIO任务现在可以命名,或者通过将name关键字参数asyncio.create_task() 或create_task()事件循环的方法,或者通过调用set_name() 任务对象的方法。任务名称在repr()输出中可见,asyncio.Task 也可以使用该get_name() 方法检索。
-
mmap.flush() 方法现在返回None成功并在所有平台下引发错误异常。以前,它的行为是平台依赖的:成功时返回非零值; 在Windows下错误返回零。成功返回零值; 在Unix下出现异常错误。
-
该函数math.factorial() 不再接受非int类的参数。
-
xml.dom.minidom和xml.sax 模块默认不再处理外部实体。
-
从只读dbm数据库(dbm.dumb, dbm.gnu或dbm.ndbm)中删除密钥会引发error(dbm.dumb.error, dbm.gnu.error或dbm.ndbm.error)而不是KeyError。
-
expanduser() 在Windows上现在更喜欢 USERPROFILE 环境变量,不使用 HOME,通常不为常规用户帐户设置。
使用#在分析或建筑价值的形式变体(例如 PyArg_ParseTuple(),Py_BuildValue() ,PyObject_CallFunction() 没有等)PY_SSIZE_T_CLEAN 定义提出了DeprecationWarning现在。它将在3.10或4.0中删除。阅读解析参数并为细节构建值。(由Inada Naoki在bpo-36381供稿。)
C API的变化
-堆分配类型的实例(例如用其创建的实例 PyType_FromSpec() )保存对其类型对象的引用。增加这些类型对象的引用计数已从 PyType_GenericAlloc() 更低级别的函数移动, PyObject_Init() 并且PyObject_INIT() 。这使得通过PyType_FromSpec() 托管代码中的其他类行为创建类型。
静态分配的类型不受影响。
对于绝大多数情况,应该没有副作用。但是,在分配实例(可能是为了解决bug)之后手动增加引用计数的类型现在可能变得不朽。为避免这种情况,这些类需要在实例释放期间在类型对象上调用Py_DECREF 。
要将这些类型正确移植到3.8,请应用以下更改:
Py_INCREF 分配实例后删除类型对象 - 如果有的话。这可能打完电话后发生的PyObject_New() , PyObject_NewVar() ,PyObject_GC_New() , PyObject_GC_NewVar() ,或使用任何其他自定义分配器 PyObject_Init() 或PyObject_INIT() 。
例:
- 1static foo_struct *
- 2foo_new(PyObject *type) {
- 3 foo_struct *foo = PyObject_GC_New(foo_struct, (PyTypeObject *) type);
- 4 if (foo == NULL)
- 5 return NULL;
- 6#if PY_VERSION_HEX < 0x03080000
- 7 // Workaround for Python issue 35810; no longer necessary in Python 3.8
- 8 PY_INCREF(type)
- 9#endif
- 10 return foo;
- 11}
确保 tp_dealloc 堆分配类型的所有自定义函数都减少了类型的引用计数。
(编辑:ASP站长网)
|