解析引數和構建值¶
這些函式在建立自己的擴充套件函式和方法時非常有用。更多資訊和示例請參見擴充套件和嵌入 Python 直譯器。
前三個描述的函式,PyArg_ParseTuple()
、PyArg_ParseTupleAndKeywords()
和 PyArg_Parse()
,都使用格式字串來告訴函式預期的引數。這些函式的格式字串使用相同的語法。
解析引數¶
格式字串由零個或多個“格式單元”組成。格式單元描述一個 Python 物件;它通常是單個字元或帶括號的格式單元序列。除少數例外,非帶括號序列的格式單元通常對應於這些函式的一個地址引數。在以下描述中,帶引號的形式是格式單元;(圓括號)中的條目是與格式單元匹配的 Python 物件型別;[方括號]中的條目是應傳遞其地址的 C 變數型別。
字串和緩衝區¶
備註
在 Python 3.12 及更早版本中,必須在包含Python.h
之前定義宏PY_SSIZE_T_CLEAN
,才能使用下面解釋的所有#
格式變體(s#
、y#
等)。在 Python 3.13 及更高版本中則不需要。
這些格式允許將物件作為連續的記憶體塊進行訪問。您無需為返回的 unicode 或位元組區域提供原始儲存。
除非另有說明,緩衝區不會以 NUL 字元終止。
字串和緩衝區有三種轉換為 C 的方式
諸如
y*
和s*
之類的格式會填充一個Py_buffer
結構。這會鎖定底層緩衝區,以便呼叫者即使在Py_BEGIN_ALLOW_THREADS
塊內也可以隨後使用緩衝區,而不會有可變資料被調整大小或銷燬的風險。因此,在處理完資料(或在任何提前中止的情況下)之後,您必須呼叫PyBuffer_Release()
。es
、es#
、et
和et#
格式會分配結果緩衝區。在處理完資料(或在任何提前中止的情況下)之後,您必須呼叫PyMem_Free()
。其他格式接受
str
或只讀的bytes-like object,例如bytes
,並提供指向其緩衝區的const char *
指標。在這種情況下,緩衝區是“借用”的:它由相應的 Python 物件管理,並與該物件的生命週期共享。您無需自行釋放任何記憶體。為了確保底層緩衝區可以安全借用,物件的
PyBufferProcs.bf_releasebuffer
欄位必須為NULL
。這會阻止常見的可變物件,如bytearray
,但也會阻止一些只讀物件,如bytes
的memoryview
。除了這個
bf_releasebuffer
要求之外,沒有檢查來驗證輸入物件是否是不可變的(例如,它是否會接受可寫緩衝區的請求,或者另一個執行緒是否可以改變資料)。
s
(str
) [const char *]將 Unicode 物件轉換為指向字元字串的 C 指標。指向現有字串的指標儲存在您傳遞地址的字元指標變數中。C 字串以 NUL 終止。Python 字串不得包含嵌入的 null 程式碼點;如果包含,將引發
ValueError
異常。Unicode 物件使用'utf-8'
編碼轉換為 C 字串。如果此轉換失敗,將引發UnicodeError
。備註
此格式不接受bytes-like objects。如果您想接受檔案系統路徑並將其轉換為 C 字元字串,最好使用
O&
格式,並以PyUnicode_FSConverter()
作為轉換器。3.5 版本中的變化: 以前,當 Python 字串中遇到嵌入的 null 程式碼點時,會引發
TypeError
。s*
(str
或 類位元組物件) [Py_buffer]此格式接受 Unicode 物件和類位元組物件。它填充呼叫者提供的
Py_buffer
結構。在這種情況下,生成的 C 字串可能包含嵌入的 NUL 位元組。Unicode 物件使用'utf-8'
編碼轉換為 C 字串。s#
(str
, 只讀 bytes-like object) [const char *,Py_ssize_t
]類似於
s*
,但它提供一個借用緩衝區。結果儲存在兩個 C 變數中,第一個是指向 C 字串的指標,第二個是其長度。字串可能包含嵌入的 null 位元組。Unicode 物件使用'utf-8'
編碼轉換為 C 字串。z
(str
或None
) [const char *]與
s
類似,但 Python 物件也可以是None
,在這種情況下,C 指標被設定為NULL
。z*
(str
, bytes-like object 或None
) [Py_buffer]類似於
s*
,但 Python 物件也可以是None
,在這種情況下,Py_buffer
結構的buf
成員被設定為NULL
。z#
(str
, 只讀 bytes-like object 或None
) [const char *,Py_ssize_t
]類似於
s#
,但 Python 物件也可以是None
,在這種情況下,C 指標被設定為NULL
。y
(只讀 bytes-like object) [const char *]此格式將類位元組物件轉換為指向借用字元字串的 C 指標;它不接受 Unicode 物件。位元組緩衝區不得包含嵌入的空位元組;如果包含,則引發
ValueError
異常。3.5 版本中的變化: 以前,當位元組緩衝區中遇到嵌入的空位元組時,會引發
TypeError
。y*
(類位元組物件) [Py_buffer]此
s*
變體不接受 Unicode 物件,只接受類位元組物件。這是接受二進位制資料的推薦方式。y#
(只讀 bytes-like object) [const char *,Py_ssize_t
]此
s#
變體不接受 Unicode 物件,只接受類位元組物件。S
(bytes
) [PyBytesObject *]要求 Python 物件是一個
bytes
物件,不嘗試任何轉換。如果物件不是位元組物件,則引發TypeError
。C 變數也可以宣告為PyObject*。Y
(bytearray
) [PyByteArrayObject *]要求 Python 物件是一個
bytearray
物件,不嘗試任何轉換。如果物件不是bytearray
物件,則引發TypeError
。C 變數也可以宣告為PyObject*。U
(str
) [PyObject *]要求 Python 物件是 Unicode 物件,不嘗試任何轉換。如果物件不是 Unicode 物件,則引發
TypeError
。C 變數也可以宣告為 PyObject*。w*
(可讀寫 bytes-like object) [Py_buffer]此格式接受任何實現讀寫緩衝區介面的物件。它會填充呼叫者提供的
Py_buffer
結構。緩衝區可能包含嵌入的空位元組。呼叫者在使用完緩衝區後必須呼叫PyBuffer_Release()
。es
(str
) [const char *encoding, char **buffer]此
s
的變體用於將 Unicode 編碼到字元緩衝區中。它僅適用於不帶嵌入 NUL 位元組的編碼資料。此格式需要兩個引數。第一個僅用作輸入,必須是指向編碼名稱(NUL 終止字串)的 const char*,或者
NULL
,在這種情況下使用'utf-8'
編碼。如果命名的編碼 Python 未知,則會引發異常。第二個引數必須是 char**;它引用的指標的值將被設定為一個緩衝區,其中包含引數文字的內容。文字將以第一個引數指定的編碼進行編碼。PyArg_ParseTuple()
將分配所需大小的緩衝區,將編碼資料複製到此緩衝區中,並調整*buffer以引用新分配的儲存空間。呼叫者負責在使用後呼叫PyMem_Free()
來釋放分配的緩衝區。et
(str
,bytes
或bytearray
) [const char *encoding, char **buffer]與
es
相同,只是位元組字串物件會直接傳遞,無需重新編碼。相反,實現假定位元組字串物件使用作為引數傳遞的編碼。es#
(str
) [const char *encoding, char **buffer,Py_ssize_t
*buffer_length]此
s#
的變體用於將 Unicode 編碼到字元緩衝區中。與es
格式不同,此變體允許包含 NUL 字元的輸入資料。它需要三個引數。第一個僅用作輸入,必須是指向編碼名稱(NUL 終止字串)的 const char*,或者
NULL
,在這種情況下使用'utf-8'
編碼。如果命名的編碼 Python 未知,則會引發異常。第二個引數必須是 char**;它引用的指標的值將被設定為一個緩衝區,其中包含引數文字的內容。文字將以第一個引數指定的編碼進行編碼。第三個引數必須是指向整數的指標;引用的整數將被設定為輸出緩衝區中的位元組數。有兩種操作模式
如果*buffer指向一個
NULL
指標,函式將分配所需大小的緩衝區,將編碼資料複製到此緩衝區中,並設定*buffer以引用新分配的儲存。呼叫者負責在使用後呼叫PyMem_Free()
來釋放分配的緩衝區。如果*buffer指向非
NULL
指標(已分配的緩衝區),PyArg_ParseTuple()
將使用此位置作為緩衝區,並將*buffer_length的初始值解釋為緩衝區大小。然後它會將編碼資料複製到緩衝區並以 NUL 終止。如果緩衝區不夠大,將設定ValueError
。在這兩種情況下,*buffer_length都被設定為編碼資料(不包括尾隨的 NUL 位元組)的長度。
et#
(str
,bytes
或bytearray
) [const char *encoding, char **buffer,Py_ssize_t
*buffer_length]與
es#
相同,只是位元組字串物件會直接傳遞,無需重新編碼。相反,實現假定位元組字串物件使用作為引數傳遞的編碼。
3.12 版本中的變化: u
, u#
, Z
, 和 Z#
已被移除,因為它們使用了舊版的 Py_UNICODE*
表示。
數字¶
這些格式允許將 Python 數字或單個字元表示為 C 數字。需要int
、float
或complex
的格式也可以使用相應的特殊方法__index__()
、__float__()
或__complex__()
將 Python 物件轉換為所需型別。
對於帶符號整數格式,如果值超出 C 型別的範圍,則會引發OverflowError
。對於無符號整數格式,不進行範圍檢查——當接收欄位太小無法接收值時,最高位會被悄悄截斷。
b
(int
) [unsigned char]將非負 Python 整數轉換為無符號微小整數,儲存在 C 的unsigned char中。
B
(int
) [unsigned char]將 Python 整數轉換為微小整數,不進行溢位檢查,儲存在 C 的unsigned char中。
h
(int
) [short int]將 Python 整數轉換為 C short int。
H
(int
) [unsigned short int]將 Python 整數轉換為 C unsigned short int,不進行溢位檢查。
i
(int
) [int]將 Python 整數轉換為普通的 C int。
I
(int
) [unsigned int]將 Python 整數轉換為 C unsigned int,不進行溢位檢查。
l
(int
) [long int]將 Python 整數轉換為 C long int。
k
(int
) [unsigned long]將 Python 整數轉換為 C unsigned long,不進行溢位檢查。
3.14 版本中的變化: 如果可用,使用
__index__()
。L
(int
) [long long]將 Python 整數轉換為 C long long。
K
(int
) [unsigned long long]將 Python 整數轉換為 C unsigned long long,不進行溢位檢查。
3.14 版本中的變化: 如果可用,使用
__index__()
。n
(int
) [Py_ssize_t
]將 Python 整數轉換為 C
Py_ssize_t
。c
(bytes
或 長度為 1 的bytearray
) [char]將表示為長度為 1 的
bytes
或bytearray
物件的 Python 位元組轉換為 C char。3.3 版本中的變化: 允許
bytearray
物件。C
(長度為 1 的str
) [int]將表示為長度為 1 的
str
物件的 Python 字元轉換為 C int。f
(float
) [float]將 Python 浮點數轉換為 C float。
d
(float
) [double]將 Python 浮點數轉換為 C double。
D
(complex
) [Py_complex]將 Python 複數轉換為 C
Py_complex
結構體。
其他物件¶
O
(object) [PyObject *]將 Python 物件(不進行任何轉換)儲存在 C 物件指標中。因此,C 程式接收到實際傳遞的物件。不會建立新的強引用(即不會增加其引用計數)。儲存的指標不是
NULL
。O!
(object) [typeobject, PyObject *]將 Python 物件儲存在 C 物件指標中。這類似於
O
,但它需要兩個 C 引數:第一個是 Python 型別物件的地址,第二個是 C 變數(型別為PyObject*)的地址,物件指標將儲存在此變數中。如果 Python 物件不具有所需型別,則引發TypeError
。
O&
(object) [converter, address]透過轉換器函式將 Python 物件轉換為 C 變數。這需要兩個引數:第一個是函式,第二個是 C 變數(任意型別)的地址,轉換為void*。轉換器函式反過來按如下方式呼叫
status = converter(object, address);
其中 object 是要轉換的 Python 物件,address 是傳遞給
PyArg_Parse*
函式的 void* 引數。返回的 status 應為1
表示成功轉換,0
表示轉換失敗。當轉換失敗時,converter 函式應引發異常並保持 address 的內容不變。如果轉換器返回
Py_CLEANUP_SUPPORTED
,那麼如果引數解析最終失敗,它可能會被第二次呼叫,從而給轉換器一個機會釋放它已經分配的任何記憶體。在第二次呼叫中,object引數將為NULL
;address將與原始呼叫中的值相同。轉換器示例:
PyUnicode_FSConverter()
和PyUnicode_FSDecoder()
。3.1 版本中的變化: 添加了
Py_CLEANUP_SUPPORTED
。p
(bool
) [int]測試傳入值的真值(布林predicate),並將結果轉換為其等效的 C 真/假整數值。如果表示式為真,將 int 設定為
1
;如果為假,則設定為0
。這接受任何有效的 Python 值。有關 Python 如何測試值的真值的更多資訊,請參閱真值測試。在 3.3 版本加入。
(items)
(sequence) [matching-items]該物件必須是 Python 序列(
str
、bytes
或bytearray
除外),其長度為 items 中格式單元的數量。C 引數必須與 items 中的各個格式單元對應。序列的格式單元可以巢狀。如果items包含儲存借用緩衝區(
s
,s#
,z
,z#
,y
, 或y#
)或借用引用(S
,Y
,U
,O
, 或O!
)的格式單元,則該物件必須是 Python 元組。items中O&
格式單元的轉換器不得儲存借用緩衝區或借用引用。3.14 版本開始不推薦: 如果items包含儲存借用緩衝區或借用引用的格式單元,則非元組序列已被棄用。
其他一些字元在格式字串中具有意義。它們不能出現在巢狀括號內。它們是:
|
表示 Python 引數列表中剩餘的引數是可選的。對應於可選引數的 C 變數應初始化為其預設值——當未指定可選引數時,
PyArg_ParseTuple()
不會觸碰相應 C 變數的內容。$
PyArg_ParseTupleAndKeywords()
專用: 指示 Python 引數列表中剩餘的引數為僅限關鍵字引數。目前,所有僅限關鍵字引數也必須是可選引數,因此格式字串中的|
必須始終在$
之前指定。在 3.3 版本加入。
:
格式單元列表在此處結束;冒號後的字串用作錯誤訊息中的函式名(
PyArg_ParseTuple()
引發的異常的“關聯值”)。;
格式單元列表在此處結束;分號後的字串用作錯誤訊息,而不是預設錯誤訊息。
:
和;
互斥。
請注意,提供給呼叫者的任何 Python 物件引用都是 借用 引用;不要釋放它們(即不要減少它們的引用計數)!
傳遞給這些函式的額外引數必須是變數的地址,其型別由格式字串確定;這些引數用於儲存輸入元組中的值。在上述格式單元列表中描述的少數情況下,這些引數用作輸入值;在這種情況下,它們應與相應格式單元的指定內容匹配。
為了使轉換成功,arg 物件必須與格式匹配,並且格式必須已用盡。成功時,PyArg_Parse*
函式返回 true;失敗時,它們返回 false 並引發適當的異常。當PyArg_Parse*
函式因某個格式單元的轉換失敗而失敗時,對應於該格式單元及後續格式單元的地址處的變數將保持不變。
API 函式¶
-
int PyArg_ParseTuple(PyObject *args, const char *format, ...)¶
- 作為 穩定 ABI 的一部分。
解析只接受位置引數的函式的引數到區域性變數。成功時返回 true;失敗時返回 false 並引發相應的異常。
-
int PyArg_VaParse(PyObject *args, const char *format, va_list vargs)¶
- 作為 穩定 ABI 的一部分。
與
PyArg_ParseTuple()
相同,但它接受一個 va_list 而不是可變數量的引數。
-
int PyArg_ParseTupleAndKeywords(PyObject *args, PyObject *kw, const char *format, char *const *keywords, ...)¶
- 作為 穩定 ABI 的一部分。
解析接受位置引數和關鍵字引數的函式的引數到區域性變數。keywords引數是一個以 null 終止的 ASCII 或 UTF-8 編碼的 C 字串形式的關鍵字引數名稱的
NULL
終止陣列。空名稱表示僅位置引數。成功時返回 true;失敗時返回 false 並引發相應的異常。備註
在 C 中,keywords 引數宣告為 char *const*,在 C++ 中為 const char *const*。這可以透過
PY_CXX_CONST
宏進行覆蓋。3.6 版本中的變化: 增加了對僅位置引數的支援。
3.13 版本中的變化: keywords引數現在在 C 中型別為char *const*,在 C++ 中型別為const char *const*,而不是char**。添加了對非 ASCII 關鍵字引數名稱的支援。
-
int PyArg_VaParseTupleAndKeywords(PyObject *args, PyObject *kw, const char *format, char *const *keywords, va_list vargs)¶
- 作為 穩定 ABI 的一部分。
與
PyArg_ParseTupleAndKeywords()
相同,但它接受一個 va_list 而不是可變數量的引數。
-
int PyArg_ValidateKeywordArguments(PyObject*)¶
- 作為 穩定 ABI 的一部分。
確保關鍵字引數字典中的鍵是字串。只有在不使用
PyArg_ParseTupleAndKeywords()
時才需要這樣做,因為後者已經進行了此檢查。在 3.2 版本加入。
-
int PyArg_Parse(PyObject *args, const char *format, ...)¶
- 作為 穩定 ABI 的一部分。
將接受單個位置引數的函式的引數解析為區域性變數。成功時返回 true;失敗時返回 false 並引發相應的異常。
示例
// Function using METH_O calling convention static PyObject* my_function(PyObject *module, PyObject *arg) { int value; if (!PyArg_Parse(arg, "i:my_function", &value)) { return NULL; } // ... use value ... }
-
int PyArg_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, ...)¶
- 作為 穩定 ABI 的一部分。
一種更簡單的引數檢索形式,它不使用格式字串來指定引數的型別。使用此方法檢索引數的函式應在函式或方法表中宣告為
METH_VARARGS
。包含實際引數的元組應作為args傳遞;它必須是一個元組。元組的長度必須至少為min且不超過max;min和max可以相等。必須向函式傳遞額外的引數,每個引數都應該是指向PyObject*變數的指標;這些變數將用args中的值填充;它們將包含借用引用。對應於args未提供的可選引數的變數將不會被填充;這些變數應由呼叫者初始化。此函式在成功時返回 true,如果args不是元組或包含錯誤數量的元素,則返回 false;如果發生故障,將設定異常。這是此函式使用示例,取自用於弱引用的
_weakref
輔助模組的原始碼static PyObject * weakref_ref(PyObject *self, PyObject *args) { PyObject *object; PyObject *callback = NULL; PyObject *result = NULL; if (PyArg_UnpackTuple(args, "ref", 1, 2, &object, &callback)) { result = PyWeakref_NewRef(object, callback); } return result; }
本例中對
PyArg_UnpackTuple()
的呼叫與對PyArg_ParseTuple()
的此呼叫完全等價PyArg_ParseTuple(args, "O|O:ref", &object, &callback)
-
PY_CXX_CONST¶
在
PyArg_ParseTupleAndKeywords()
和PyArg_VaParseTupleAndKeywords()
的keywords引數宣告中,如果有的話,要插入到char *const*之前的R值。對於 C 預設為空,對於 C++ 預設為const
(const char *const*)。要覆蓋,請在包含Python.h
之前將其定義為所需值。在 3.13 版本加入。
構建值¶
-
PyObject *Py_BuildValue(const char *format, ...)¶
- 返回值: 新引用。 穩定ABI 的一部分。
根據類似於
PyArg_Parse*
系列函式接受的格式字串和一系列值來建立新值。成功時返回該值;如果出錯,則返回NULL
;如果返回NULL
,將引發異常。Py_BuildValue()
並不總是構建元組。它僅在其格式字串包含兩個或更多格式單元時才構建元組。如果格式字串為空,它返回None
;如果它只包含一個格式單元,它返回該格式單元所描述的任何物件。要強制它返回大小為 0 或 1 的元組,請將格式字串括起來。當記憶體緩衝區作為引數傳遞以提供資料來構建物件時,例如對於
s
和s#
格式,所需資料會被複制。呼叫者提供的緩衝區絕不會被Py_BuildValue()
建立的物件引用。換句話說,如果您的程式碼呼叫malloc()
並將分配的記憶體傳遞給Py_BuildValue()
,那麼一旦Py_BuildValue()
返回,您的程式碼就有責任為該記憶體呼叫free()
。在以下描述中,帶引號的形式是格式單元;(圓括號)中的條目是格式單元將返回的 Python 物件型別;[方括號]中的條目是要傳遞的 C 值型別。
格式字串中會忽略空格、製表符、冒號和逗號(但在
s#
等格式單元內則不會)。這可以用於使長格式字串更易讀。s
(str
或None
) [const char *]使用
'utf-8'
編碼將以 null 結尾的 C 字串轉換為 Pythonstr
物件。如果 C 字串指標為NULL
,則使用None
。s#
(str
或None
) [const char *,Py_ssize_t
]使用
'utf-8'
編碼將 C 字串及其長度轉換為 Pythonstr
物件。如果 C 字串指標為NULL
,則忽略長度並返回None
。y
(bytes
) [const char *]此函式將 C 字串轉換為 Python
bytes
物件。如果 C 字串指標為NULL
,則返回None
。y#
(bytes
) [const char *,Py_ssize_t
]此函式將 C 字串及其長度轉換為 Python 物件。如果 C 字串指標為
NULL
,則忽略長度並返回None
。z
(str
或None
) [const char *]與
s
相同。z#
(str
或None
) [const char *,Py_ssize_t
]與
s#
相同。u
(str
) [const wchar_t *]將以 null 結尾的
wchar_t
Unicode(UTF-16 或 UCS-4)資料緩衝區轉換為 Python Unicode 物件。如果 Unicode 緩衝區指標為NULL
,則返回None
。u#
(str
) [const wchar_t *,Py_ssize_t
]將 Unicode (UTF-16 或 UCS-4) 資料緩衝區及其長度轉換為 Python Unicode 物件。如果 Unicode 緩衝區指標為
NULL
,則忽略長度並返回None
。U
(str
或None
) [const char *]與
s
相同。U#
(str
或None
) [const char *,Py_ssize_t
]與
s#
相同。i
(int
) [int]將普通的 C int 轉換為 Python 整數物件。
b
(int
) [char]將普通的 C char 轉換為 Python 整數物件。
h
(int
) [short int]將普通的 C short int 轉換為 Python 整數物件。
l
(int
) [long int]將 C long int 轉換為 Python 整數物件。
B
(int
) [unsigned char]將 C unsigned char 轉換為 Python 整數物件。
H
(int
) [unsigned short int]將 C unsigned short int 轉換為 Python 整數物件。
I
(int
) [unsigned int]將 C unsigned int 轉換為 Python 整數物件。
k
(int
) [unsigned long]將 C unsigned long 轉換為 Python 整數物件。
L
(int
) [long long]將 C long long 轉換為 Python 整數物件。
K
(int
) [unsigned long long]將 C unsigned long long 轉換為 Python 整數物件。
n
(int
) [Py_ssize_t
]將 C
Py_ssize_t
轉換為 Python 整數。p
(bool
) [int]將 C int 轉換為 Python
bool
物件。請注意,此格式需要一個
int
引數。與 C 語言中的大多數其他上下文不同,可變引數不會自動強制轉換為合適的型別。您可以使用(x) ? 1 : 0
或!!x
將其他型別(例如,指標或浮點數)轉換為合適的int
值。在 3.14 版本加入。
c
(長度為 1 的bytes
)[char]將表示位元組的 C int 轉換為長度為 1 的 Python
bytes
物件。C
(長度為 1 的str
) [int]將表示字元的 C int 轉換為長度為 1 的 Python
str
物件。d
(float
) [double]將 C double 轉換為 Python 浮點數。
f
(float
) [float]將 C float 轉換為 Python 浮點數。
D
(complex
) [Py_complex *]將 C
Py_complex
結構轉換為 Python 複數。O
(object) [PyObject *]不加修改地傳遞 Python 物件,但建立對它的新強引用(即其引用計數增加一)。如果傳入的物件是
NULL
指標,則假定這是因為生成引數的呼叫發現錯誤並設定了異常。因此,Py_BuildValue()
將返回NULL
但不會引發異常。如果尚未引發異常,則設定SystemError
。S
(object) [PyObject *]與
O
相同。N
(object) [PyObject *]與
O
相同,不同之處在於它不建立新的強引用。當物件由引數列表中對物件建構函式的呼叫建立時很有用。O&
(object) [converter, anything]透過 converter 函式將 anything 轉換為 Python 物件。該函式以 anything(應與 void* 相容)作為其引數進行呼叫,並應返回一個新的 Python 物件,如果發生錯誤則返回
NULL
。(items)
(tuple
) [matching-items]將一系列 C 值轉換為具有相同專案數的 Python 元組。
[items]
(list
) [matching-items]將一系列 C 值轉換為具有相同專案數的 Python 列表。
{items}
(dict
) [matching-items]將一系列 C 值轉換為 Python 字典。每對連續的 C 值向字典新增一個專案,分別作為鍵和值。
如果格式字串中存在錯誤,則設定
SystemError
異常並返回NULL
。
-
PyObject *Py_VaBuildValue(const char *format, va_list vargs)¶
- 返回值: 新引用。 穩定ABI 的一部分。
與
Py_BuildValue()
相同,不同之處在於它接受va_list
而不是可變數量的引數。