簡介
****

「Python 函式庫」包含了許多不同的部分。

函式庫中包括被視為程式語言「核心」部分的資料型態，像是數字 (number) 或
是串列 (list)。對於這些型別，Python 核心對這些字面值 (literal) 的形式
做定義，並對它們的語意制定了一些限制，但在此同時卻不把文字對應的語意完
全定義。（另一方面，Python 在語法面上有確實的定義，例如拼字或是運算元
次序）

Python 函式庫也囊括了內建函式與例外處理——這些物件都可以不用透過
"import" 陳述式來引入 Python 程式中就能使用。函式庫中有部份是被 Python
核心所定義的，但在這裡僅解釋最核心的語意部分。

整個函式庫中包含了許多模組，有許多方法可以從函式庫中取用這些模組。有些
模組是以 C 語言撰寫並建置於 Python 編譯器之中，其他的是由 Python 撰寫
並以源碼的方式 (source form) 引入。有些模組提供的功能是專屬於 Python
的，像是把 stack trace 印出來；有些則是針對特定作業系統，去試著存取特
定硬體；還有些提供對特定應用的功能與操作介面，像是 World Wide Web。模
組的使用情況會因機器與 Python 的版本而不同，部分模組是開放所有版本以及
Port 的 Python 來使用的，但有些會因系統支援或需求在某些版本或系統下無
法使用，甚至有些僅限在特定的設定環境下才能使用。

這個手冊會「深入淺出」地介紹 Python 函式庫。它會先介紹一些內建函式、資
料型態、和一些例外處理，再來一章章的主題式介紹相關模組。

這代表如果你從這個手冊的最開始讀起，並在感到無聊時跳到下一個章節，你仍
然可以得到一個對 Python 函式庫所支援的模組與其合理應用的概觀。當然，你
*沒有必要*像是在讀一本小說一樣讀這本手冊——你可以快速瀏覽目錄（在手冊的
最前頭）、或是你可以利用最後面的索引來查詢特定的函式或模組。最後，如果
你享受閱讀一些隨機的主題，你可以選擇一個隨機的數字並開始閱讀（見
"random" 模組) 。不管你想要以什麼順序來閱讀這個手冊，內建函式會是一個
很好的入門，因為手冊中其他章節都預設你已經對這個章節有一定的熟悉程度。

讓我們開始吧！


可用性之註釋
============

* 如果出現「適用：Unix」註釋，則代表該函式普遍存在於 Unix 系統中，但這
  並不保證其存在於某特定作業系統。

* 如果沒有分別註釋的話，有標明「適用：Unix」註釋的所有函式也都於 macOS
  上支援，因其建於 Unix 核心之上。

* 如果一条可用性注释同时包含最低 Kernel 版本和最低 libc 版本，则两个条
  件都必须满足。 例如当某个特性带有注释 *可用性: Linux >= 3.17 且
  glibc >= 2.27* 则表示同时要求 Linux 3.17 以上版本和 glibc 2.27 以上
  版本。


WebAssembly 平台
----------------

WebAssembly 平台 "wasm32-emscripten" (Emscripten) 和 "wasm32-wasi"
(WASI) 分别提供了 POSIX API 的一个子集。 WebAssembly 运行时和浏览器都
处于沙盒模式中并具有对主机和外部资源的受限访问权。 任何使用了进程、线
程、网络、信号或其他形式的进程间通信 (IPC) 的 Python 标准库模块都或者
不可用，或者其作用方式与在其他类 Unix 系统上不同。 文件 I/O, 文件系统
和 Unix 权限相关的函数也同样会受限。 Emscripten 不允许阻塞式 I/O。 其
他阻塞式操作如 "sleep()" 则会阻塞浏览器的事件循环。

Python 在 WebAssembly 平台上的特性与行为依赖于 Emscripten-SDK 或 WASI-
SDK 的版本, WASM 运行时 (浏览器, NodeJS, wasmtime) 以及 Python 编译时
旗标。 WebAssembly, Emscripten 和 WASI 都是尚在不断演化中的标准；某些
特性例如网络可能会在未来被支持。

对于在浏览器上运行的 Python，用户可以考虑 Pyodide 或 PyScript。
PyScript 是在 Pyodide 之上构建的，后者本身则是在 CPython 和 Emscripten
之上构建的。 Pyodide 提供了对浏览器的 JavaScript 和 DOM API 的访问并通
过 JavaScript 的 "XMLHttpRequest" 和 "Fetch" API 提供了受限的网络功能
。

* 进程相关的 API 或者不可用或者将始终报错失败。 这包括生成新进程
  ("fork()", "execve()"), 等待进程 ("waitpid()"), 发送信号 ("kill()")
  或者以其他方式与进程交互的 API。 "subprocess" 可以被导入但将没有任何
  作用。

* "socket" 模块可以使用，但将会受限而使其行为与在其他平台上不一致。 在
  Emscripten 上，套接字将始终为非阻塞式的并且要求额外的 JavaScript 代
  码和服务器上的辅助工具来代理通过 WebSockets 的 TCP；请参阅
  Emscripten Networking 了解详情。 WASI snapshot preview 1 只允许来自
  现有文件描述符的套接字。

* 某些函数是不执行任何操作的空壳或是始终返回硬编码的值。

* 有关文件描述符、文件访问权、文件所有权和链接的函数均受到限制并且不支
  持某些操作。 例如，WASI 不允许具有绝对文件名的符号链接。
