# 已棄用項目

## Python 3.14 中待移除的項目

- `argparse`：`argparse.BooleanOptionalAction` 的 type、choices 和 metavar 參數已被棄用，將在 3.14 中移除。 (由 Nikita Sobolev 於 gh-92248 貢獻。)

- `ast`：自 Python 3.8 起，下列功能已在文件中被棄用，現在在存取或使用時會於 runtime 發出 `DeprecationWarning`，並將在 Python 3.14 中移除：

  - `ast.Num`

  - `ast.Str`

  - `ast.Bytes`

  - `ast.NameConstant`

  - `ast.Ellipsis`

  請改用 `ast.Constant`。（由 Serhiy Storchaka 於 gh-90953 貢獻。）

- `asyncio`：

  - 已棄用並將在 Python 3.14 中移除的 child watcher 類別：`MultiLoopChildWatcher`、`FastChildWatcher`、`AbstractChildWatcher` 和 `SafeChildWatcher`。 (由 Kumar Aditya 於 gh-94597 貢獻。)

  - `asyncio.set_child_watcher()`、`asyncio.get_child_watcher()`、`asyncio.AbstractEventLoopPolicy.set_child_watcher()` 和 `asyncio.AbstractEventLoopPolicy.get_child_watcher()` 已被棄用並將在 Python 3.14 中移除。（由 Kumar Aditya 於 gh-94597 貢獻。）

  - 預設事件迴圈策略的 `get_event_loop()` 方法現在會在沒有設定目前事件迴圈且決定建立一個時發出 `DeprecationWarning`。 (由 Serhiy Storchaka 和 Guido van Rossum 於 gh-100160 貢獻。)

- `collections.abc`：已棄用 `ByteString`。請改用 `Sequence` 或 `Buffer`。在 typing 中使用時，請改用聯集，如 `bytes | bytearray`，或 `collections.abc.Buffer`。（由 Shantanu Jain 於 gh-91896 貢獻。）

- `email`：已棄用 `email.utils.localtime()` 中的 isdst 參數。（由 Alan Williams 於 gh-72346 貢獻。）

- `importlib`：`__package__` 和 `__cached__` 將不再被設定或被 import 系統考慮。 (gh-97879)

- `importlib.abc` 的已棄用類別：

  - `importlib.abc.ResourceReader`

  - `importlib.abc.Traversable`

  - `importlib.abc.TraversableResources`

  請改用 `importlib.resources.abc` 類別：

  - `importlib.resources.abc.Traversable`

  - `importlib.resources.abc.TraversableResources`

  （由 Jason R. Coombs 和 Hugo van Kemenade 貢獻於 gh-93963。）

- `itertools` 有不以文件記錄、效率低下、過去常有 bug 且不一致的 copy、deepcopy 和 pickle 操作支援。將在 3.14 中移除以大幅減少程式碼量和維護負擔。 (由 Raymond Hettinger 於 gh-101588 貢獻。)

- `multiprocessing`：預設的啟動方法將在 Linux、BSD 和其他非 macOS POSIX 平台上更改為更安全的 方法，目前 `'fork'` 是預設值 (gh-84559)。對此增加一個 runtime 警告被認為太過擾人，因為 大多數程式碼不會在意。請使用 `get_context()` 或 `set_start_method()` API 來明確指定你的程式碼何時需要 `'fork'`。請參閱 Contexts and start methods。

- `pathlib`：已棄用 `is_relative_to()` 和 `relative_to()`：額外引數的傳遞已被棄用。

- `pkgutil`：`find_loader()` 和 `get_loader()` 現在會引發 `DeprecationWarning`；請改用 `importlib.util.find_spec()`。 (由 Nikita Sobolev 於 gh-97850 貢獻。)

- `pty`：

  - `master_open()`：請用 `pty.openpty()`。

  - `slave_open()`：請用 `pty.openpty()`。

- `sqlite3`：

  - `version` 和 `version_info`。

  - `execute()` 和 `executemany()`，如果使用 named placeholders 且 parameters 是序列而不是 `dict`。

  - date 和 datetime 的適配器 (adapter)、date 和 timestamp 轉換器 (converter)：請參閱 `sqlite3` 文件以獲得建議的替代方案。

- `types.CodeType`：自 3.10 起，存取 `co_lnotab` 已在 PEP 626 中被棄用，並計劃在 3.12 中移除，但只在 3.12 中於適當時發出 `DeprecationWarning`。可能在 3.14 中移除。（由 Nikita Sobolev 於 gh-101866 貢獻。）

- `typing`：自 Python 3.9 起已被棄用的 `ByteString` 現在在使用時會發出 `DeprecationWarning`。

- `urllib`：`urllib.parse.Quoter` 已被棄用：它並非預期的公開 API。(由 Gregory P. Smith 於 gh-88168 貢獻。)

## Python 3.15 中待移除的項目

- `ctypes`：

  - 自 Python 3.13 起，未記錄的 `ctypes.SetPointerType()` 函式已被棄用。

- `http.server`：

  - 過時且很少使用的 `CGIHTTPRequestHandler` 自 Python 3.13 起已被棄用。不存在直接的替代。任何東西都比 CGI 更好地將 Web 伺服器與請求處理程序介接起來。

  - 自 Python 3.13 起，python -m http.server 命令列介面的 `--cgi` 旗標已被棄用。

- `locale`：

  - `getdefaultlocale()` 已在 Python 3.11 中被棄用，原本計劃在 Python 3.13 中移除 (gh-90817)，但被延後至 Python 3.15。請改用 `getlocale()`、`setlocale()` 和 `getencoding()`。 (由 Hugo van Kemenade 於 gh-111187 貢獻。)

- `pathlib`：

  - `PurePath.is_reserved()` 已自 Python 3.13 被棄用。請用 `os.path.isreserved()` 來偵測 Windows 上的保留路徑。

- `platform`：

  - 自 Python 3.13 起，`java_ver()` 已被棄用。此函式僅對 Jython 支援有用，具有令人困惑的 API，基本上未經測試。

- `threading`：

  - `RLock()` 在 Python 3.15 中將不接受任何引數。自 Python 3.14 起，傳遞任何引數的用法已被棄用，因為 Python 版本不允許任何引數，但 C 版本允許任意數量的位置或關鍵字引數，並忽略每個引數。

- `typing`：

  - 用於建立 `NamedTuple` 類別的未以文件記錄之關鍵字引數語法 (`Point = NamedTuple("Point", x=int, y=int)`) 已自 Python 3.13 棄用。請改用基於類別的語法或函式語法 (functional syntax)。

  - 自 Python 3.13 起，`typing.no_type_check_decorator()` 裝飾器函式已被棄用。在 `typing` 模組中使用了八年之後，它尚未得到任何主要型別檢查器的支援。

- `wave`：

  - 已棄用 `Wave_read` 和 `Wave_write` 類別的 `getmark()`、`setmark()` 和 `getmarkers()` 方法自 Python 3.13 被棄用。

## Python 3.16 中待移除的項目

- `builtins`：

  - 自 Python 3.12 起，布林型別的位元反轉 `~True` 或 `~False` 已被棄用，因為它會產生不預期且不直觀的結果（`-2` 和 `-1`）。使用 `not x` 代替布林值的邏輯否定。在極少數情況下，你需要對底層的整數進行位元反轉，請明確轉換為 `~int(x)` (`~int(x)`)。

- `array`：

  - 自 Python 3.3 起，`'u'` 格式碼 (`wchar_t`) 在文件中已被棄用，自 Python 3.13 起在 runtime 已被棄用。請使用 `'w'` 格式碼 (`Py_UCS4`) 來取代 Unicode 字元。

- `shutil`：

  - 自 Python 3.14 起，`ExecError` 例外已被棄用。自 Python 3.4 以來，它尚未被 `shutil` 中的任何函式使用，現在是 `RuntimeError` 的別名。

- `symtable`：

  - 自 Python 3.14 起，`Class.get_methods` 方法已被棄用。

- `sys`：

  - 自 Python 3.13 起，`_enablelegacywindowsfsencoding()` 函式已被棄用。請改用 `PYTHONLEGACYWINDOWSFSENCODING` 環境變數。

- `tarfile`：

  - 自 Python 3.13 起，未以文件記錄和未被使用的 `TarFile.tarfile` 屬性已被棄用。

## 未來版本中的待移除項目

以下 API 將在未來被移除，雖然目前尚未安排移除日期。

- `argparse`：已棄用巢狀引數群組和巢狀互斥群組。

- `array` 的 `'u'` 格式碼 (gh-57281)

- `builtins`：

  - `bool(NotImplemented)`。

  - 產生器：`throw(type, exc, tb)` 和 `athrow(type, exc, tb)` 簽名已被棄用：請改用 `throw(exc)` 和 `athrow(exc)`，為單引數簽名。

  - 目前 Python 接受數值字面值後面立即接關鍵字，例如 `0in x`、`1or x`、`0if 1else 2`。它讓表達式模糊且容易混淆，如 `[0x1for x in y]`（可以解釋為 `[0x1 for x in y]` 或 `[0x1f or x in y]`）。如果數值字面值後立即接 `and`、`else`、`for`、`if`、`in`、`is` 和 `or` 之一的關鍵字，則會引發語法警告。在未來版本中，它將被更改為語法錯誤。(gh-87999)

  - `__index__()` 和 `__int__()` 方法回傳非 int 型別的支援：這些方法將需要回傳 `int` 的嚴格子類別實例。

  - 回傳 `float` 嚴格子類別 `__float__()` 方法的支援：這些方法將需要回傳 `float` 的實例。

  - 回傳 `complex` 嚴格子類別 `__complex__()` 方法的支援：這些方法將需要回傳 `complex` 的實例。

  - 將 `int()` 委派給 `__trunc__()` 方法。

  - 在 `complex()` 建構子中將複數作為 real 或 imag 引數傳遞現在已被棄用；它應該只作為單個位置引數傳遞。 (由 Serhiy Storchaka 於 gh-109218 貢獻。)

- `calendar`：`calendar.January` 和 `calendar.February` 常數已被棄用並被 `calendar.JANUARY` 和 `calendar.FEBRUARY` 取代。 (由 Prince Roshan 於 gh-103636 貢獻。)

- `codeobject.co_lnotab`：請改用 `codeobject.co_lines()` 方法。

- `datetime`：

  - `utcnow()`：請改用 `datetime.datetime.now(tz=datetime.UTC)`。

  - `utcfromtimestamp()`：請改用 `datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)`。

- `gettext`：複數值必須是整數。

- `importlib`：

  - `load_module()` method：請改用 `exec_module()`。

  - `cache_from_source()` debug_override 參數已被棄用：請改用 optimization 參數。

- `importlib.metadata`：

  - `EntryPoints` 元組介面。

  - 回傳值上的隱式 `None`。

- `logging`: the `warn()` method has been deprecated since Python 3.3, use `warning()` instead.

- `mailbox`：已棄用 StringIO 輸入和文本模式，請改用 BytesIO 和二進位模式。

- `os`：在多執行緒行程中呼叫 `os.register_at_fork()`。

- `pydoc.ErrorDuringImport`：exc_info 參數的元組值已被棄用，請用例外實例。

- `re`：現在對正規表示式中的數值群組參照和群組名稱用了更嚴格的規則。現在只有 ASCII 數碼序列被接受作為數值參照。位元組模式和替換字串中的群組名稱現在只能包含 ASCII 字母、數碼和底線。（由 Serhiy Storchaka 於 gh-91760 貢獻。）

- `sre_compile`、`sre_constants` 和 `sre_parse` 模組。

- `shutil`：`rmtree()` 的 onerror 參數在 Python 3.12 中已被棄用；請改用 onexc 參數。

- `ssl` 選項和協定：

  - 不帶協定引數的 `ssl.SSLContext` 已被棄用。

  - `ssl.SSLContext`：`set_npn_protocols()` 和 `selected_npn_protocol()` 已被棄用：請改用 ALPN。

  - `ssl.OP_NO_SSL*` 選項

  - `ssl.OP_NO_TLS*` 選項

  - `ssl.PROTOCOL_SSLv3`

  - `ssl.PROTOCOL_TLS`

  - `ssl.PROTOCOL_TLSv1`

  - `ssl.PROTOCOL_TLSv1_1`

  - `ssl.PROTOCOL_TLSv1_2`

  - `ssl.TLSVersion.SSLv3`

  - `ssl.TLSVersion.TLSv1`

  - `ssl.TLSVersion.TLSv1_1`

- `sysconfig.is_python_build()` 的 check_home 參數已被棄用並被忽略。

- `threading` 方法：

  - `threading.Condition.notifyAll()`：請用 `notify_all()`。

  - `threading.Event.isSet()`：請用 `is_set()`。

  - `threading.Thread.isDaemon()`、`threading.Thread.setDaemon()`：請用 `threading.Thread.daemon` 屬性。

  - `threading.Thread.getName()`、`threading.Thread.setName()`：請用 `threading.Thread.name` 屬性。

  - `threading.currentThread()`：請用 `threading.current_thread()`。

  - `threading.activeCount()`：請用 `threading.active_count()`。

- `typing.Text` (gh-92332)。

- `unittest.IsolatedAsyncioTestCase`：從測試案例中回傳非 `None` 的值已被棄用。

- `urllib.parse` 已棄用函式：請改用 `urlparse()`。

  - `splitattr()`

  - `splithost()`

  - `splitnport()`

  - `splitpasswd()`

  - `splitport()`

  - `splitquery()`

  - `splittag()`

  - `splittype()`

  - `splituser()`

  - `splitvalue()`

  - `to_bytes()`

- `urllib.request`：呼叫請求的 `URLopener` 和 `FancyURLopener` 風格已被棄用。請改用更新的 `urlopen()` 函式和方法。

- `wsgiref`：`SimpleHandler.stdout.write()` 不應該進行部分寫入。

- `xml.etree.ElementTree`：已棄用對 `Element` 的真值測試。在未來版本中，它將始終回傳 `True`。請改用明確的 `len(elem)` 或 `elem is not None` 測試。

- `zipimport.zipimporter.load_module()` 已被棄用：請改用 `exec_module()`。

## C API 的棄用項目

### Python 3.14 中待移除的項目

- `PyDictObject` 中的 `ma_version_tag` 欄位，用於擴充模組 ( PEP 699；gh-101193)。

- 使用可變基底建立`不可變型別` (gh-95388)。

- 設定 Python 初始化的函式，Python 3.11 中已被棄用：

  - `PySys_SetArgvEx()`：請改以 `PyConfig.argv` 設定。

  - `PySys_SetArgv()`：請改以 `PyConfig.argv` 設定。

  - `Py_SetProgramName()`()`：請改以 `PyConfig.program_name` 設定。

  - `Py_SetPythonHome()`：請改以 `PyConfig.home` 設定。

  `Py_InitializeFromConfig()` API 應該與 `PyConfig` 一起使用。

- 全域設定變數：

  - `Py_DebugFlag`：請改用 `PyConfig.parser_debug`。

  - `Py_VerboseFlag`：請改用 `PyConfig.verbose`。

  - `Py_QuietFlag`：請改用 `PyConfig.quiet`。

  - `Py_InteractiveFlag`：請改用 `PyConfig.interactive`。

  - `Py_InspectFlag`：請改用 `PyConfig.inspect`。

  - `Py_OptimizeFlag`：請改用 `PyConfig.optimization_level`。

  - `Py_NoSiteFlag`：請改用 `PyConfig.site_import`。

  - `Py_BytesWarningFlag`：請改用 `PyConfig.bytes_warning`。

  - `Py_FrozenFlag`：請改用 `PyConfig.pathconfig_warnings`。

  - `Py_IgnoreEnvironmentFlag`：請改用 `PyConfig.use_environment`。

  - `Py_DontWriteBytecodeFlag`：請改用 `PyConfig.write_bytecode`。

  - `Py_NoUserSiteDirectory`：請改用 `PyConfig.user_site_directory`。

  - `Py_UnbufferedStdioFlag`：請改用 `PyConfig.buffered_stdio`。

  - `Py_HashRandomizationFlag`：請改用 `PyConfig.use_hash_seed` 和 `PyConfig.hash_seed`。

  - `Py_IsolatedFlag`：請改用 `PyConfig.isolated`。

  - `Py_LegacyWindowsFSEncodingFlag`：請改用 `PyPreConfig.legacy_windows_fs_encoding`。

  - `Py_LegacyWindowsStdioFlag`：請改用 `PyConfig.legacy_windows_stdio`。

  - `Py_FileSystemDefaultEncoding`：請改用 `PyConfig.filesystem_encoding`。

  - `Py_HasFileSystemDefaultEncoding`：請改用 `PyConfig.filesystem_encoding`。

  - `Py_FileSystemDefaultEncodeErrors`：請改用 `PyConfig.filesystem_errors`。

  - `Py_UTF8Mode`：請改用 `PyPreConfig.utf8_mode`。（請見 `Py_PreInitialize()`）

  `Py_InitializeFromConfig()` API 應該與 `PyConfig` 一起使用。

### Python 3.15 中待移除的項目

- `libmpdecimal` 的打包副本 (bundled copy)。

- `PyImport_ImportModuleNoBlock()`：請改用 `PyImport_ImportModule()`。

- `PyWeakref_GetObject()` 和 `PyWeakref_GET_OBJECT()`：請改用 `PyWeakref_GetRef()`。

- `Py_UNICODE` 型別與 `Py_UNICODE_WIDE` 巨集：請改用 `wchar_t`。

- Python 初始化函式：

  - `PySys_ResetWarnOptions()`：請改為清除 `sys.warnoptions` 和 `warnings.filters`。

  - `Py_GetExecPrefix()`：請改用 `sys.exec_prefix`。

  - `Py_GetPath()`：請改用 `sys.path`。

  - `Py_GetPrefix()`：請改用 `sys.prefix`。

  - `Py_GetProgramFullPath()`：請改用 `sys.executable`。

  - `Py_GetProgramName()`：請改用 `sys.executable`。

  - `Py_GetPythonHome()`：請改用 `PyConfig.home` 或 `PYTHONHOME` 環境變數。

### 未來版本中的待移除項目

下列 API 已被棄用並將會被移除，不過目前尚未訂定移除日期。

- `Py_TPFLAGS_HAVE_FINALIZE`：自 Python 3.8 起不再需要

- `PyErr_Fetch()`：請改用 `PyErr_GetRaisedException()`。

- `PyErr_NormalizeException()`：請改用 `PyErr_GetRaisedException()`。

- `PyErr_Restore()`：請改用 `PyErr_SetRaisedException()`。

- `PyModule_GetFilename()`：請改用 `PyModule_GetFilenameObject()`。

- `PyOS_AfterFork()`：請改用 `PyOS_AfterFork_Child()`。

- `PySlice_GetIndicesEx()`：請改用 `PySlice_Unpack()` 和 `PySlice_AdjustIndices()`。

- `PyUnicode_AsDecodedObject()`：請改用 `PyCodec_Decode()`。

- `PyUnicode_AsDecodedUnicode()`：請改用 `PyCodec_Decode()`。

- `PyUnicode_AsEncodedObject()`：請改用 `PyCodec_Encode()`。

- `PyUnicode_AsEncodedUnicode()`：請改用 `PyCodec_Encode()`。

- `PyUnicode_READY()`：自 Python 3.12 起不再需要

- `PyErr_Display()`：請改用 `PyErr_DisplayException()`。

- `_PyErr_ChainExceptions()`：請改用 `_PyErr_ChainExceptions1`。

- `PyBytesObject.ob_shash` 成員：請改為呼叫 `PyObject_Hash()`。

- `PyDictObject.ma_version_tag` 成員。

- 執行緒局部儲存 (Thread Local Storage, TLS) API：

  - `PyThread_create_key()`：請改用 `PyThread_tss_alloc()`。

  - `PyThread_delete_key()`：請改用 `PyThread_tss_free()`。

  - `PyThread_set_key_value()`：請改用 `PyThread_tss_set()`。

  - `PyThread_get_key_value()`：請改用 `PyThread_tss_get()`。

  - `PyThread_delete_key_value()`：請改用 `PyThread_tss_delete()`。

  - `PyThread_ReInitTLS()`：自 Python 3.7 起不再需要。