整数型オブジェクト (integer object)¶
すべての整数は任意の長さをもつ "long" 整数として実装されます。
エラーが起きると、ほとんどの PyLong_As* API は (return type)-1 を返しますが、これは数値と見分けが付きません。
見分けを付けるためには PyErr_Occurred() を使ってください。
-
type PyLongObject¶
- 次に属します: Limited API (不透明な構造体として).
この
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 実装の詳細: CPython keeps an array of integer objects for all integers between
-5and256. When you create an int in that range you actually just get back a reference to the existing object.
-
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_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を送出します。参考
Python methods
int.to_bytes()andint.from_bytes()to convert aPyLongObjectto/from an array of bytes in base256. You can call those from C usingPyObject_CallMethod().
-
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)¶
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)¶
buffer の先頭 n_bytes バイトに格納された値を符号なし数値として解釈し、Python の整数を作成します。
flags は
PyLong_AsNativeBytes()と同じです。-1を渡すと、CPython のコンパイル時のネイティブなエンディアンを選び、最上位ビットを符号ビットではないとみなします。 エンディアン以外のフラグは無視します。Added in version 3.13.
-
PyLong_FromPid(pid)¶
Macro for creating a Python integer from a process identifier.
This can be defined as an alias to
PyLong_FromLong()orPyLong_FromLongLong(), depending on the size of the system's PID type.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)¶
Exactly equivalent to the preferred
PyLong_AsLong. In particular, it can fail withOverflowErroror another exception.Soft deprecated since version 3.14.
-
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__()を使わなくなりました。
-
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()を使ってください。
-
PyLong_AsPid(pid)¶
Macro for converting a Python integer into a process identifier.
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.
-
Py_ssize_t PyLong_AsNativeBytes(PyObject *pylong, void *buffer, Py_ssize_t n_bytes, int flags)¶
Python の整数値 pylong を、サイズ n_bytes のネイティブな buffer にコピーします。 flags に
-1を指定すると C のキャストと同様に動作し、後述する値を指定すると動作を制御できます。エラー時には例外を送出して
-1を返します。 pylong を整数として解釈できない場合や、Py_ASNATIVEBYTES_REJECT_NEGATIVEフラグが設定されているときに pylong が負である場合に、エラーが発生する可能性があります。Otherwise, returns the number of bytes required to store the value. If this is equal to or less than n_bytes, the entire value was copied. All n_bytes of the buffer are written: remaining bytes filled by copies of the sign bit.
If the returned value is greater than n_bytes, the value was truncated: as many of the lowest bits of the value as could fit are written, and the higher bits are ignored. This matches the typical behavior of a C-style downcast.
注釈
オーバーフローはエラーとはみなしません。 戻り値が 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¶
-1-
Py_ASNATIVEBYTES_BIG_ENDIAN¶
0-
Py_ASNATIVEBYTES_LITTLE_ENDIAN¶
1-
Py_ASNATIVEBYTES_NATIVE_ENDIAN¶
3-
Py_ASNATIVEBYTES_UNSIGNED_BUFFER¶
4-
Py_ASNATIVEBYTES_REJECT_NEGATIVE¶
8-
Py_ASNATIVEBYTES_ALLOW_INDEX¶
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¶
-
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.