はじめに
********

この "Python ライブラリ" には様々な内容が収録されています。

このライブラリには、数値型やリスト型のような、通常は言語の "核" をなす
部分とみなされるデータ型が含まれています。Python 言語のコア部分では、
これらの型に対してリテラル表現形式を与え、意味づけ上のいくつかの制約を
与えていますが、完全にその意味づけを定義しているわけではありません。(
一方で、言語のコア部分では演算子のスペルや優先順位のような構文法的な属
性を定義しています。)

このライブラリにはまた、組み込み関数と例外が納められています --- 組み
込み関数および例外は、全ての Python で書かれたコード上で、 "import" 文
を使わずに使うことができるオブジェクトです。これらの組み込み要素のうち
いくつかは言語のコア部分で定義されていますが、大半は言語コアの意味づけ
上不可欠なものではないのでここでしか記述されていません。

とはいえ、このライブラリの大部分に収録されているのはモジュールのコレク
ションです。このコレクションを細分化する方法はいろいろあります。あるモ
ジュールは C 言語で書かれ、Python インタプリタに組み込まれています; 一
方別のモジュールは Python で書かれ、ソースコードの形式で取り込まれます
。またあるモジュールは、例えば実行スタックの追跡結果を出力するといった
、Python に非常に特化したインターフェースを提供し、一方他のモジュール
では、特定のハードウェアにアクセスするといった、特定のオペレーティング
システムに特化したインターフェースを提供し、さらに別のモジュールでは
WWW (ワールドワイドウェブ) のような特定のアプリケーション分野に特化し
たインターフェースを提供しています。モジュールによっては全てのバージョ
ン、全ての移植版の Python で利用することができたり、背後にあるシステム
がサポートしている場合にのみ使えたり、Python をコンパイルしてインスト
ールする際に特定の設定オプションを選んだときにのみ利用できたりします。

このマニュアルは "内部から外部へ" と構成されています。つまり、最初に組
み込みの関数を記述し、組み込みのデータ型、例外、そして最後に各モジュー
ルと続きます。モジュールは関係のあるものでグループ化して一つの章にして
います。

つまり、このマニュアルを最初から読み始め、読み飽きたところで次の章に進
めば、 Python ライブラリで利用できるモジュールやサポートしているアプリ
ケーション領域の概要をそこそこ理解できるということです。もちろん、この
マニュアルを小説のように読む必要は *ありません* --- (マニュアルの先頭
部分にある) 目次にざっと目を通したり、 (最後尾にある) 索引でお目当ての
関数やモジュール、用語を探すことだってできます。もしランダムな項目につ
いて勉強してみたいのなら、ランダムにページを選び ("random" 参照)、そこ
から 1, 2 節読むこともできます。このマニュアルの各節をどんな順番で読む
かに関わらず、 組み込み関数 の章から始めるとよいでしょう。マニュアルの
他の部分は、この節の内容について知っているものとして書かれているからで
す。

それでは、ショーの始まりです！


利用可能性について
==================

* 「利用できる環境 : Unix 」の意味はこの関数が Unix システムにあること
  が多いということです。このことは特定の OS における存在を主張するもの
  ではありません。

* 特に記述がない場合、「利用できる環境 : Unix 」と書かれている関数は、
  ともに Unix をコアにしている macOS と iOS でも利用することができます
  。

* 利用可能性の注釈に最小カーネルバージョンと最小 libc バージョンの両方
  が含まれている場合は、両方の条件を満たさなければなりません。例えば、
  *Availability: Linux >= 3.17 with glibc >= 2.27* という注釈付きの機
  能には、 Linux 3.17 以上と、 glibc 2.27 以上の両方が必要です。


WebAssembly プラットフォーム
----------------------------

WebAssembly プラットフォームである "wasm32-emscripten" (Emscripten) と
"wasm32-wasi" (WASI) は、 POSIX API のサブセットを提供します。
WebAssembly ランタイムとブラウザーはサンドボックス化されており、ホスト
や外部リソースへのアクセスが制限されています。プロセス、スレッド、ネッ
トワーク、シグナル、または他の形のプロセス間通信 (IPC) を使用する標準
ライブラリモジュールは、利用不可か、他の Unix ライクなシステムのように
は動作しません。ファイル I/O 、ファイルシステム、 Unix の権限関係の機
能も制限されています。 Emscripten はブロッキング I/O を許可しません。
"sleep()" のような他のブロッキング操作は、ブラウザーのイベントループを
ブロックします。

WebAssembly プラットフォーム上での Python の 性質と振る舞いは、
Emscripten-SDK や WASI-SDK のバージョン、 WASM ランタイム (ブラウザ、
NodeJS 、 wasmtime) 、Python のビルド時フラグによって決まります。
WebAssembly や Emscripten 、 WASI は標準を発展させており、ネットワーク
などの機能は将来的にサポートされるかもしれません

ブラウザ上の Python では、ユーザーは  Pyodide や PyScript を検討すべき
でしょう。 PyScript は、 Pyodide をもとにして構築されており、 Pyodide
自体は CPython や Emscripten 上に構築されています。 Pyodide は、ブラウ
ザの JavaScript と DOM API だけでなく、 JavaScript の "XMLHttpRequest"
や "Fetch" API による制限されたネットワーク機能へのアクセスを提供しま
す。

* プロセス関連の API は利用不可能か、常にエラーにより失敗します。これ
  には、新しいプロセスを作成 ("fork()" や "execve()") 、プロセスを待機
  ("waitpid()") 、シグナルを送信 ("kill()") 、もしくはプロセスと通信す
  る API が含まれます。 "subprocess" はインポート可能ですが、機能しま
  せん。

* The "socket" module is available, but is limited and behaves
  differently from other platforms. On Emscripten, sockets are always
  non-blocking and require additional JavaScript code and helpers on
  the server to proxy TCP through WebSockets; see Emscripten
  Networking for more information. WASI snapshot preview 1 only
  permits sockets from an existing file descriptor.

* Some functions are stubs that either don't do anything and always
  return hardcoded values.

* Functions related to file descriptors, file permissions, file
  ownership, and links are limited and don't support some operations.
  For example, WASI does not permit symlinks with absolute file names.


iOS
---

ほとんどの点において、 iOS は POSIX オペレーティングシステムです。ファ
イル I/Oやソケット処理、スレッドは全て POSIX オペレーティングシステム
上と同様に動作します。しかし、 iOS と他のPOSIX システムの間には、いく
つかの大きな違いがあります。

* iOS では、 "埋め込み" モードの Python のみが有効です。 Python の
  REPL は存在せず、通常の Python 開発の一部である、 **pip** のように、
  バイナリを実行する能力もありません。 Python のコードを iOS アプリに
  追加するためには、 Python 埋め込み API を使用して、 Xcode で作成され
  た iOS アプリに Python インタープリターを追加する必要があります。詳
  細は、iOS 使用ガイド にあります。

* iOS アプリは、どのような形であっても、サブプロセスやバックグラウンド
  プロセス、プロセス間通信を使用することはできません。 iOS アプリがサ
  ブプロセスを作成しようと試みると、サブプロセスを作成するプロセスは、
  ロックアップまたはクラッシュします。 iOS アプリには、この目的のため
  に存在する iOS 固有の API 以外には、実行中の他のアプリケーションの可
  視性も、実行中の他のアプリケーションと通信する機能もありません。

* iOS アプリでは、 (システム時計のような) システムリソースを変更するこ
  とは制限されています。これらのリソースは読み込み可能であることがよく
  ありますが、リソースの変更は大抵失敗します。

* iOS アプリには、コンソールの入出力に関して限られた概念しかありません
  。 "stdout" と "stderr" は存在し、 "stdout" と "stderr" に書き出され
  たコンテンツは Xcode で実行中にログに表示されますが、システムログに
  は記録されません。もしアプリをインストールしたユーザーが診断補助とし
  てアプリのログを提供する場合は、 "stdout" または "stderr" に書き込ま
  れた詳細は含まれません。

  iOS アプリには、 "stdin" の概念はまったくありません。 iOS アプリでは
  キーボードが使用可能な場合もありますが、これはソフトウェアの機能であ
  り、 "stdin" に属するものではありません。

  このため、コンソール操作に関係する Python ライブラリ ("curses" や
  "readline") は iOS では使用可能ではありません。
