整数型オブジェクト (integer object)¶
すべての整数は任意の長さをもつ "long" 整数として実装されます。
エラーが起きると、ほとんどの PyLong_As* API は (return type)-1 を返しますが、これは数値と見分けが付きません。
見分けを付けるためには PyErr_Occurred() を使ってください。
-
type PyLongObject¶
- 次に属します: Stable ABI (不透明な構造体として).
この
PyObjectのサブタイプは Python の整数オブジェクトを表します。
-
PyTypeObject PyLong_Type¶
- 次に属します: Stable ABI.
この
PyTypeObjectのインスタンスは Python 整数型を表現します。これは Python レイヤにおけるintと同じオブジェクトです。
-
int PyLong_Check(PyObject *p)¶
引数が
PyLongObjectかPyLongObjectのサブタイプであるときに真を返します。この関数は常に成功します。
-
int PyLong_CheckExact(PyObject *p)¶
引数が
PyLongObjectであるがPyLongObjectのサブタイプでないときに真を返します。この関数は常に成功します。
-
PyObject *PyLong_FromLong(long v)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
v から新たな
PyLongObjectオブジェクトを生成して返します。失敗のときにはNULLを返します。CPython は
-5から1024までのすべての整数について、整数オブジェクトの配列を保持しています。 この範囲の int を作成すると、実際には既存のオブジェクトへの参照が返されます。
-
PyObject *PyLong_FromUnsignedLong(unsigned long v)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
Cの unsigned long から新たな
PyLongObjectオブジェクトを生成して返します。失敗した際にはNULLを返します。
-
PyObject *PyLong_FromSsize_t(Py_ssize_t v)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
C の
Py_ssize_t型から新たなPyLongObjectオブジェクトを生成して返します。 失敗のときにはNULLを返します。
-
PyObject *PyLong_FromSize_t(size_t v)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
C の
size_t型から新たなPyLongObjectオブジェクトを生成して返します。 失敗のときにはNULLを返します。
-
PyObject *PyLong_FromLongLong(long long v)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
C の long long 型から新たな
PyLongObjectオブジェクトを生成して返します。失敗のときにはNULLを返します。
-
PyObject *PyLong_FromUnsignedLongLong(unsigned long long v)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
C の unsigned long long 型から新たな
PyLongObjectオブジェクトを生成して返します。失敗のときにはNULLを返します。
-
PyObject *PyLong_FromInt32(int32_t value)¶
-
PyObject *PyLong_FromInt64(int64_t value)¶
- 次に属します: Stable ABI (バージョン 3.14 より).
符号付きの C の int32_t または int64_t から、新しい
PyLongObjectオブジェクトを作成して返します。 失敗すると例外を設定してNULLを返します。Added in version 3.14.
-
PyObject *PyLong_FromUInt32(uint32_t value)¶
-
PyObject *PyLong_FromUInt64(uint64_t value)¶
- 次に属します: Stable ABI (バージョン 3.14 より).
符号なしの C の uint32_t または uint64_t から、新しい
PyLongObjectオブジェクトを作成して返します。 失敗すると例外を設定してNULLを返します。Added in version 3.14.
-
PyObject *PyLong_FromDouble(double v)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
v の整数部から新たな
PyLongObjectオブジェクトを生成して返します。失敗のときにはNULLを返します。
-
PyObject *PyLong_FromString(const char *str, char **pend, int base)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
str 内の文字列を base の基数で解釈し、新しい
PyLongObjectを作成して返します。 失敗するとNULLを返します。 pend がNULLでなければ、成功時には *pend が str の末尾を、エラー時には処理できなかった最初の文字を指します。 base が0の場合、str は 整数リテラル の定義に従って解釈します。 この場合、ゼロでない 10 進数の先頭にゼロがあるとValueErrorを送出します。 base が0でない場合は、2以上36以下でなければなりません。 先頭と末尾の空白、および基数指定子の後や数字の間にある単独のアンダースコアは無視します。 数字がない場合や、数字と末尾の空白の後で str が NULL 終端されていない場合は、ValueErrorを送出します。参考
PyLong_AsNativeBytes()とPyLong_FromNativeBytes()を使うと、PyLongObjectと基数256のバイト配列を相互に変換できます。
-
PyObject *PyLong_FromUnicodeObject(PyObject *u, int base)¶
- 戻り値: 新しい参照。
文字列 u 内の Unicode 数字の列を Python の整数値に変換します。
Added in version 3.3.
-
PyObject *PyLong_FromVoidPtr(void *p)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
ポインタ p から Python 整数値を生成します。ポインタの値は
PyLong_AsVoidPtr()を適用した結果から取得されます。
-
PyObject *PyLong_FromNativeBytes(const void *buffer, size_t n_bytes, int flags)¶
- 次に属します: Stable ABI (バージョン 3.14 より).
buffer の先頭 n_bytes バイトに格納された値を、2 の補数表現の符号付き数値として解釈し、Python の整数を作成します。
flags は
PyLong_AsNativeBytes()と同じです。-1を渡すと、CPython のコンパイル時のネイティブなエンディアンを選び、最上位ビットを符号ビットとみなします。Py_ASNATIVEBYTES_UNSIGNED_BUFFERを渡すと、PyLong_FromUnsignedNativeBytes()の呼び出しと同じ結果になります。 他のフラグは無視します。Added in version 3.13.
-
PyObject *PyLong_FromUnsignedNativeBytes(const void *buffer, size_t n_bytes, int flags)¶
- 次に属します: Stable ABI (バージョン 3.14 より).
buffer の先頭 n_bytes バイトに格納された値を符号なし数値として解釈し、Python の整数を作成します。
flags は
PyLong_AsNativeBytes()と同じです。-1を渡すと、CPython のコンパイル時のネイティブなエンディアンを選び、最上位ビットを符号ビットではないとみなします。 エンディアン以外のフラグは無視します。Added in version 3.13.
-
PyLong_FromPid(pid)¶
プロセス識別子から Python の整数を作成するマクロです。
システムの PID 型のサイズに応じて、
PyLong_FromLong()またはPyLong_FromLongLong()の別名として定義されることがあります。Added in version 3.2.
-
long PyLong_AsLong(PyObject *obj)¶
- 次に属します: Stable ABI.
obj を表す C の long を返します。 obj が
PyLongObjectのインスタンスでない場合、まず__index__()メソッド (存在する場合) を呼び出してPyLongObjectに変換します。もし obj の値が long の範囲外であれば、
OverflowErrorを送出します。エラーが起きたときに
-1を返します。 見分けを付けるためにはPyErr_Occurred()を使ってください。バージョン 3.8 で変更: 可能であれば
__index__()を使うようになりました。バージョン 3.10 で変更: この関数は
__int__()を使わなくなりました。-
long PyLong_AS_LONG(PyObject *obj)¶
推奨される
PyLong_AsLongと完全に等価です。 特に、OverflowErrorや他の例外で失敗する場合があります。バージョン 3.14 で ソフト非推奨 <Soft deprecated>.
-
long PyLong_AS_LONG(PyObject *obj)¶
-
int PyLong_AsInt(PyObject *obj)¶
- 次に属します: Stable ABI (バージョン 3.13 より).
PyLong_AsLong()と同様ですが、結果を C の long ではなく int に格納します。Added in version 3.13.
-
long PyLong_AsLongAndOverflow(PyObject *obj, int *overflow)¶
- 次に属します: Stable ABI.
obj を表す C の long を返します。 obj が
PyLongObjectのインスタンスでない場合、まず__index__()メソッド (存在する場合) を呼び出してPyLongObjectに変換します。obj の値が
LONG_MAXより大きい場合は *overflow に1、LONG_MINより小さい場合は-1を設定し、-1を返します。 それ以外の場合は *overflow に0を設定します。 他の例外が発生した場合は、*overflow に0を設定し、通常どおり-1を返します。エラーが起きたときに
-1を返します。 見分けを付けるためにはPyErr_Occurred()を使ってください。バージョン 3.8 で変更: 可能であれば
__index__()を使うようになりました。バージョン 3.10 で変更: この関数は
__int__()を使わなくなりました。
-
long long PyLong_AsLongLong(PyObject *obj)¶
- 次に属します: Stable ABI.
obj を表す C の long long を返します。 obj が
PyLongObjectのインスタンスでない場合、まず__index__()メソッド (存在する場合) を呼び出してPyLongObjectに変換します。もし obj の値が long long の範囲外であれば、
OverflowErrorを送出します。エラーが起きたときに
-1を返します。 見分けを付けるためにはPyErr_Occurred()を使ってください。バージョン 3.8 で変更: 可能であれば
__index__()を使うようになりました。バージョン 3.10 で変更: この関数は
__int__()を使わなくなりました。
-
long long PyLong_AsLongLongAndOverflow(PyObject *obj, int *overflow)¶
- 次に属します: Stable ABI.
obj を表す C の long long を返します。 obj が
PyLongObjectのインスタンスでない場合、まず__index__()メソッド (存在する場合) を呼び出してPyLongObjectに変換します。obj の値が
LLONG_MAXより大きい場合は *overflow に1、LLONG_MINより小さい場合は-1を設定し、-1を返します。 それ以外の場合は *overflow に0を設定します。 他の例外が発生した場合は、*overflow に0を設定し、通常どおり-1を返します。エラーが起きたときに
-1を返します。 見分けを付けるためにはPyErr_Occurred()を使ってください。Added in version 3.2.
バージョン 3.8 で変更: 可能であれば
__index__()を使うようになりました。バージョン 3.10 で変更: この関数は
__int__()を使わなくなりました。
-
Py_ssize_t PyLong_AsSsize_t(PyObject *pylong)¶
- 次に属します: Stable ABI.
pylong を表す C の
Py_ssize_tを返します。 pylong はPyLongObjectのインスタンスでなければなりません。もし pylong の値が
Py_ssize_tの範囲外であれば、OverflowErrorを送出します。エラーが起きたときに
-1を返します。 見分けを付けるためにはPyErr_Occurred()を使ってください。
-
unsigned long PyLong_AsUnsignedLong(PyObject *pylong)¶
- 次に属します: Stable ABI.
pylong を表す C の unsigned long を返します。 pylong は
PyLongObjectのインスタンスでなければなりません。もし pylong の値が unsigned long の範囲外であれば、
OverflowErrorを送出します。エラーが起きたときに
(unsigned long)-1を返します。 見分けを付けるためにはPyErr_Occurred()を使ってください。
-
size_t PyLong_AsSize_t(PyObject *pylong)¶
- 次に属します: Stable ABI.
pylong を表す C の
size_tを返します。 pylong はPyLongObjectのインスタンスでなければなりません。もし pylong の値が
size_tの範囲外であれば、OverflowErrorを送出します。エラーが起きたときに
(size_t)-1を返します。 見分けを付けるためにはPyErr_Occurred()を使ってください。
-
unsigned long long PyLong_AsUnsignedLongLong(PyObject *pylong)¶
- 次に属します: Stable ABI.
pylong を表す C の unsigned long long を返します。 pylong は
PyLongObjectのインスタンスでなければなりません。もし pylong の値が unsigned long long の範囲外であれば、
OverflowErrorを送出します。エラーが起きたときに
(unsigned long long)-1を返します。 見分けを付けるためにはPyErr_Occurred()を使ってください。バージョン 3.1 で変更: 負 pylong を指定した際に
TypeErrorではなく、OverflowErrorを送出するようになりました。
-
unsigned long PyLong_AsUnsignedLongMask(PyObject *obj)¶
- 次に属します: Stable ABI.
obj を表す C の unsigned long を返します。 obj が
PyLongObjectのインスタンスでない場合、まず__index__()メソッド (存在する場合) を呼び出してPyLongObjectに変換します。obj の値が unsigned long の範囲から外れていた場合は、
ULONG_MAX + 1を法とした剰余を返します。エラーが起きたときに
(unsigned long)-1を返します。 見分けを付けるためにはPyErr_Occurred()を使ってください。バージョン 3.8 で変更: 可能であれば
__index__()を使うようになりました。バージョン 3.10 で変更: この関数は
__int__()を使わなくなりました。
-
unsigned long long PyLong_AsUnsignedLongLongMask(PyObject *obj)¶
- 次に属します: Stable ABI.
obj を表す C の unsigned long long を返します。 obj が
PyLongObjectのインスタンスでない場合、まず__index__()メソッド (存在する場合) を呼び出してPyLongObjectに変換します。obj の値が unsigned long long の範囲から外れていた場合は、
ULLONG_MAX + 1を法とした剰余を返します。エラーが起きたときに
(unsigned long long)-1を返します。 見分けを付けるためにはPyErr_Occurred()を使ってください。バージョン 3.8 で変更: 可能であれば
__index__()を使うようになりました。バージョン 3.10 で変更: この関数は
__int__()を使わなくなりました。
-
int PyLong_AsInt32(PyObject *obj, int32_t *value)¶
-
int PyLong_AsInt64(PyObject *obj, int64_t *value)¶
- 次に属します: Stable ABI (バージョン 3.14 より).
*value に、obj を表す符号付きの C の int32_t または int64_t の値を設定します。
obj が
PyLongObjectのインスタンスでない場合、まず__index__()メソッド (存在する場合) を呼び出してPyLongObjectに変換します。obj の値が範囲外の場合は
OverflowErrorを送出します。成功すると *value を設定して
0を返します。 エラー時には例外を設定して-1を返します。value は
NULLであってはなりません。Added in version 3.14.
-
int PyLong_AsUInt32(PyObject *obj, uint32_t *value)¶
-
int PyLong_AsUInt64(PyObject *obj, uint64_t *value)¶
- 次に属します: Stable ABI (バージョン 3.14 より).
*value に、obj を表す符号なしの C の uint32_t または uint64_t の値を設定します。
obj が
PyLongObjectのインスタンスでない場合、まず__index__()メソッド (存在する場合) を呼び出してPyLongObjectに変換します。obj が負の場合は
ValueErrorを送出します。obj の値が範囲外の場合は
OverflowErrorを送出します。
成功すると *value を設定して
0を返します。 エラー時には例外を設定して-1を返します。value は
NULLであってはなりません。Added in version 3.14.
-
double PyLong_AsDouble(PyObject *pylong)¶
- 次に属します: Stable ABI.
pylong を表す C の double を返します。 pylong は
PyLongObjectのインスタンスでなければなりません。もし pylong の値が double の範囲外であれば、
OverflowErrorを送出します。エラーが起きたときに
-1.0を返します。 見分けを付けるためにはPyErr_Occurred()を使ってください。
-
void *PyLong_AsVoidPtr(PyObject *pylong)¶
- 次に属します: Stable ABI.
Python の整数 pylong を C の void ポインタに変換します。 pylong を変換できない場合は
OverflowErrorを送出します。 利用可能な void ポインタが得られることを保証するのは、PyLong_FromVoidPtr()で作成した値に対してだけです。エラーが起きたときに
NULLを返します。 見分けを付けるためにはPyErr_Occurred()を使ってください。
-
Py_ssize_t PyLong_AsNativeBytes(PyObject *pylong, void *buffer, Py_ssize_t n_bytes, int flags)¶
- 次に属します: Stable ABI (バージョン 3.14 より).
Python の整数値 pylong を、サイズ n_bytes のネイティブな buffer にコピーします。 flags に
-1を指定すると C のキャストと同様に動作し、後述する値を指定すると動作を制御できます。エラー時には例外を送出して
-1を返します。 pylong を整数として解釈できない場合や、Py_ASNATIVEBYTES_REJECT_NEGATIVEフラグが設定されているときに pylong が負である場合に、エラーが発生する可能性があります。それ以外の場合は、値を格納するのに必要なバイト数を返します。 その値が n_bytes 以下であれば、値全体がコピーされています。 バッファの n_bytes バイトすべてに書き込み、余ったバイトは符号ビットを繰り返して埋めます。
戻り値が n_bytes より大きい場合は、値が切り詰められています。 収まるだけの下位ビットを書き込み、上位ビットは無視します。 これは C 形式のダウンキャストの典型的な動作と同じです。
注釈
オーバーフローはエラーとはみなしません。 戻り値が n_bytes より大きい場合、上位ビットは破棄されています。
0を返すことはありません。値は常に 2 の補数表現でコピーします。
使用例です。
int32_t value; Py_ssize_t bytes = PyLong_AsNativeBytes(pylong, &value, sizeof(value), -1); if (bytes < 0) { // 失敗。理由を示す Python の例外が設定されています。 return NULL; } else if (bytes <= (Py_ssize_t)sizeof(value)) { // 成功。 } else { // オーバーフローしましたが、'value' には切り詰めた // pylong の下位ビットが格納されています。 }
n_bytes にゼロを渡すと、値を格納するのに十分なバッファサイズを返します。 厳密に必要なサイズより大きい場合がありますが、不合理に大きくなることはありません。 n_bytes=0 の場合、buffer は
NULLでも構いません。注釈
この関数に n_bytes=0 を渡しても、値の正確なビット長は求められません。
サイズが不明な Python の値全体を取得するには、この関数を 2 回呼び出せます。 最初にバッファサイズを調べ、次にバッファを埋めます。
// 必要な領域のサイズを調べます。 Py_ssize_t expected = PyLong_AsNativeBytes(pylong, NULL, 0, -1); if (expected < 0) { // 失敗。理由を示す Python の例外が設定されています。 return NULL; } assert(expected != 0); // API の定義上、ゼロにはなりません。 uint8_t *bignum = malloc(expected); if (!bignum) { PyErr_SetString(PyExc_MemoryError, "bignum malloc failed."); return NULL; } // 値全体を安全に取得します。 Py_ssize_t bytes = PyLong_AsNativeBytes(pylong, bignum, expected, -1); if (bytes < 0) { // 例外が設定されています。 free(bignum); return NULL; } else if (bytes > expected) { // この状況は起きないはずです。 PyErr_SetString(PyExc_RuntimeError, "Unexpected bignum truncation after a size check."); free(bignum); return NULL; } // 上の事前チェックから期待される成功です。 // ... bignum を使います ... free(bignum);
flags には、C のキャストに最も近い動作をするデフォルトを選ぶ
-1(Py_ASNATIVEBYTES_DEFAULTS)、または以下の表にある他のフラグの組み合わせを指定します。-1は他のフラグと組み合わせられないことに注意してください。現在、
-1はPy_ASNATIVEBYTES_NATIVE_ENDIAN | Py_ASNATIVEBYTES_UNSIGNED_BUFFERに相当します。Flag
値
-
Py_ASNATIVEBYTES_DEFAULTS¶
- 次に属します: Stable ABI (バージョン 3.14 より).
-1-
Py_ASNATIVEBYTES_BIG_ENDIAN¶
- 次に属します: Stable ABI (バージョン 3.14 より).
0-
Py_ASNATIVEBYTES_LITTLE_ENDIAN¶
- 次に属します: Stable ABI (バージョン 3.14 より).
1-
Py_ASNATIVEBYTES_NATIVE_ENDIAN¶
- 次に属します: Stable ABI (バージョン 3.14 より).
3-
Py_ASNATIVEBYTES_UNSIGNED_BUFFER¶
- 次に属します: Stable ABI (バージョン 3.14 より).
4-
Py_ASNATIVEBYTES_REJECT_NEGATIVE¶
- 次に属します: Stable ABI (バージョン 3.14 より).
8-
Py_ASNATIVEBYTES_ALLOW_INDEX¶
- 次に属します: Stable ABI (バージョン 3.14 より).
16Py_ASNATIVEBYTES_NATIVE_ENDIANを指定すると、他のエンディアンのフラグより優先されます。 値2は予約されています。By default, sufficient buffer will be requested to include a sign bit. For example, when converting 128 with n_bytes=1, the function will return 2 (or more) in order to store a zero sign bit.
Py_ASNATIVEBYTES_UNSIGNED_BUFFERを指定すると、サイズの計算からゼロの符号ビットを除外します。 これにより、例えば 128 を 1 バイトのバッファに収めることができます。 コピー先のバッファを後で符号付きとして扱うと、正の入力値が負になる場合があります。 このフラグは負の値の扱いには影響せず、負の値には常に符号ビットのための領域が要求されることに注意してください。Py_ASNATIVEBYTES_REJECT_NEGATIVEを指定すると、pylong が負の場合に例外を設定します。 このフラグを指定しない場合は、Py_ASNATIVEBYTES_UNSIGNED_BUFFERの指定の有無にかかわらず、少なくとも符号ビット 1 つ分の領域があれば負の値をコピーします。Py_ASNATIVEBYTES_ALLOW_INDEXを指定して整数以外の値を渡すと、最初にその値の__index__()メソッドを呼び出します。 その結果 Python コードが実行され、他のスレッドも実行できるようになる場合があり、使用中の他のオブジェクトや値が変化する可能性があります。 flags が-1の場合、このオプションは設定されず、整数以外の値はTypeErrorを引き起こします。注釈
デフォルトの flags (
-1、または REJECT_NEGATIVE を指定しない UNSIGNED_BUFFER) では、複数の Python の整数が、オーバーフローせずに同じ 1 つの値に対応することがあります。 例えば255と-1はどちらも 1 バイトのバッファに収まり、すべてのビットを立てます。 これは C のキャストの典型的な動作と同じです。Added in version 3.13.
-
Py_ASNATIVEBYTES_DEFAULTS¶
-
PyLong_AsPid(pid)¶
Python の整数をプロセス識別子に変換するマクロです。
This can be defined as an alias to
PyLong_AsLong(),PyLong_FromLongLong(), orPyLong_AsInt(), depending on the size of the system's PID type.Added in version 3.2.
-
int PyLong_GetSign(PyObject *obj, int *sign)¶
整数オブジェクト obj の符号を取得します。
成功すると *sign に整数の符号 (ゼロ、負、正の整数に対してそれぞれ 0、-1、+1) を設定し、0 を返します。
失敗すると例外を設定して -1 を返します。 obj が
PyLongObjectまたはそのサブタイプであれば、この関数は常に成功します。Added in version 3.14.
-
int PyLong_IsPositive(PyObject *obj)¶
整数オブジェクト obj が正かどうか (
obj > 0) を調べます。obj が
PyLongObjectまたはそのサブタイプのインスタンスである場合、正なら1、それ以外なら0を返します。 それらのインスタンスでない場合は例外を設定して-1を返します。Added in version 3.14.
-
int PyLong_IsNegative(PyObject *obj)¶
整数オブジェクト obj が負かどうか (
obj < 0) を調べます。obj が
PyLongObjectまたはそのサブタイプのインスタンスである場合、負なら1、それ以外なら0を返します。 それらのインスタンスでない場合は例外を設定して-1を返します。Added in version 3.14.
-
int PyLong_IsZero(PyObject *obj)¶
整数オブジェクト obj がゼロかどうかを調べます。
obj が
PyLongObjectまたはそのサブタイプのインスタンスである場合、ゼロなら1、それ以外なら0を返します。 それらのインスタンスでない場合は例外を設定して-1を返します。Added in version 3.14.
-
PyObject *PyLong_GetInfo(void)¶
- 次に属します: Stable ABI.
成功すると、Python の整数の内部表現に関する情報を格納した、読み出し専用の 名前付きタプル を返します。 各フィールドの説明は
sys.int_infoを参照してください。失敗すると例外を設定して
NULLを返します。Added in version 3.1.
-
int PyUnstable_Long_IsCompact(const PyLongObject *op)¶
- これは Unstable APIです。マイナーリリースで予告なく変更されることがあります。
op がコンパクトであれば 1、それ以外なら 0 を返します。
この関数を使うと、性能が重要なコードで小さい整数向けの「高速な処理経路」を実装できます。 コンパクトな値には
PyUnstable_Long_CompactValue()を使い、それ以外の値にはPyLong_As*関数またはPyLong_AsNativeBytes()にフォールバックしてください。ほとんどの利用者にとって、速度の向上はごくわずかと考えられます。
どの値をコンパクトとみなすかは実装の詳細であり、変更される可能性があります。
Added in version 3.12.
-
Py_ssize_t PyUnstable_Long_CompactValue(const PyLongObject *op)¶
- これは Unstable APIです。マイナーリリースで予告なく変更されることがあります。
PyUnstable_Long_IsCompact()で判定して op がコンパクトであれば、その値を返します。それ以外の場合、戻り値は未定義です。
Added in version 3.12.
ビルド設定¶
-
PYLONG_BITS_IN_DIGIT¶
CPython の整数のネイティブ表現で、各桁に使うビット数です。 現在の値は
30(デフォルト) または15で、Python のビルド時に--enable-big-digitsで選択します。整数のネイティブ表現にアクセスするには、代わりに
PyLong_GetNativeLayout()と、そのbits_per_digitメンバーを使ってください。
エクスポート API¶
Added in version 3.14.
-
type PyLongLayout¶
- 次に属します: Stable ABI (すべてのメンバーを含む) (バージョン 3.15 より).
任意精度の整数の絶対値を表す「桁」(GMP の用語では「limb」) の配列のレイアウトです。
PyLong_GetNativeLayout()を使うと、Python のintオブジェクトのネイティブなレイアウトを取得できます。 これは、絶対値が「十分に大きい」整数に内部で使われるレイアウトです。Python で同様の情報を提供する
sys.int_infoも参照してください。-
uint8_t bits_per_digit¶
1 桁あたりのビット数です。 例えば 15 ビットの桁では、ビット 0–14 が意味のある情報を持ちます。
-
uint8_t digit_size¶
バイト単位の桁のサイズです。 例えば 15 ビットの桁には少なくとも 2 バイトが必要です。
-
int8_t digits_order¶
桁の順序:
最上位の桁が先なら
1最下位の桁が先なら
-1
-
int8_t digit_endianness¶
桁のエンディアン:
最上位バイトが先 (ビッグエンディアン) なら
1最下位バイトが先 (リトルエンディアン) なら
-1
-
uint8_t bits_per_digit¶
-
const PyLongLayout *PyLong_GetNativeLayout(void)¶
- 次に属します: Stable ABI (バージョン 3.15 より).
Python の
intオブジェクトのネイティブなレイアウトを取得します。PyLongLayout構造体を参照してください。Python の初期化前や終了処理後にこの関数を呼び出してはいけません。 返されたレイアウトは Python の終了処理まで有効です。 レイアウトはプロセス内のすべての Python サブインタープリタで同じなので、キャッシュできます。
-
type PyLongExport¶
- 次に属します: Stable ABI (すべてのメンバーを含む) (バージョン 3.15 より).
Python の
intオブジェクトのエクスポートです。次の 2 つの場合があります:
-
Py_ssize_t ndigits¶
digits配列の桁数です。digitsがNULLでない場合だけ有効です。
-
const void *digits¶
符号なしの桁を格納する読み出し専用の配列です。
NULLの場合もあります。
-
Py_ssize_t ndigits¶
-
int PyLong_Export(PyObject *obj, PyLongExport *export_long)¶
- 次に属します: Stable ABI (バージョン 3.15 より).
Python の
intオブジェクトをエクスポートします。export_long は、呼び出し側が割り当てた
PyLongExport構造体を指す必要があります。NULLであってはなりません。成功すると *export_long を埋め、
0を返します。 エラー時には例外を設定して-1を返します。エクスポートが不要になったら
PyLong_FreeExport()を呼び出す必要があります。obj が Python の
intオブジェクトまたはそのサブクラスであれば、この関数は常に成功します。
-
void PyLong_FreeExport(PyLongExport *export_long)¶
- 次に属します: Stable ABI (バージョン 3.15 より).
PyLong_Export()が作成したエクスポート export_long を解放します。export_long->digits が
NULLの場合、PyLong_FreeExport()の呼び出しは省略できます。
PyLongWriter API¶
PyLongWriter API を使って整数をインポートできます。
Added in version 3.14.
-
type PyLongWriter¶
- 次に属します: Stable ABI (不透明な構造体として) (バージョン 3.15 より).
Python の
intライターのインスタンスです。インスタンスは
PyLongWriter_Finish()またはPyLongWriter_Discard()で破棄する必要があります。
-
PyLongWriter *PyLongWriter_Create(int negative, Py_ssize_t ndigits, void **digits)¶
- 次に属します: Stable ABI (バージョン 3.15 より).
PyLongWriterを作成します。成功すると *digits を割り当て、ライターを返します。 エラー時には例外を設定して
NULLを返します。negative は、負の数なら
1、それ以外なら0とします。ndigits は digits 配列の桁数です。 0 より大きくなければなりません。
digits は
NULLであってはなりません。この関数の呼び出しが成功したら、呼び出し側は桁の配列 digits を埋め、
PyLongWriter_Finish()を呼び出して Python のintを取得する必要があります。 digits のレイアウトはPyLong_GetNativeLayout()で記述されます。各桁の値は [
0;(1 << bits_per_digit) - 1] の範囲内でなければなりません (bits_per_digitは 1 桁あたりのビット数です)。 使わない上位の桁はすべて0に設定する必要があります。または、
PyLongWriter_Discard()を呼び出して、intオブジェクトを作成せずにライターのインスタンスを破棄します。
-
PyObject *PyLongWriter_Finish(PyLongWriter *writer)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI (バージョン 3.15 より).
PyLongWriter_Create()で作成したPyLongWriterの処理を完了します。成功すると Python の
intオブジェクトを返します。 エラー時には例外を設定してNULLを返します。この関数は桁の正規化を行い、必要に応じてオブジェクトをコンパクトな整数に変換します。
呼び出し後は、ライターのインスタンスと digits 配列は無効になります。
-
void PyLongWriter_Discard(PyLongWriter *writer)¶
- 次に属します: Stable ABI (バージョン 3.15 より).
PyLongWriter_Create()で作成したPyLongWriterを破棄します。writer が
NULLの場合は何もしません。呼び出し後は、ライターのインスタンスと digits 配列は無効になります。
非推奨の API¶
これらのマクロは ソフト非推奨 です。
PyLongObject インスタンスの内部表現のパラメーターを記述します。
代わりに PyLong_GetNativeLayout() と、整数データを読み取るための PyLong_Export()、または書き込むための PyLongWriter を使ってください。
これらは現在は同じレイアウトを使っていますが、CPython の整数の内部表現が変わっても正しく動作し続けるように設計されています。
-
PyLong_SHIFT¶
PyLong_GetNativeLayout()の出力のbits_per_digitと等価です。
-
PyLong_BASE¶
現在は 1 << PyLong_SHIFT と等価です。
-
PyLong_MASK¶
現在は (1 << PyLong_SHIFT) - 1 と等価です。