解析引數和構建值

這些函式在建立自己的擴充套件函式和方法時非常有用。更多資訊和示例請參見擴充套件和嵌入 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()

  • eses#etet#格式會分配結果緩衝區。在處理完資料(或在任何提前中止的情況下)之後,您必須呼叫PyMem_Free()

  • 其他格式接受 str 或只讀的bytes-like object,例如bytes,並提供指向其緩衝區的const char *指標。在這種情況下,緩衝區是“借用”的:它由相應的 Python 物件管理,並與該物件的生命週期共享。您無需自行釋放任何記憶體。

    為了確保底層緩衝區可以安全借用,物件的PyBufferProcs.bf_releasebuffer欄位必須為NULL。這會阻止常見的可變物件,如bytearray,但也會阻止一些只讀物件,如bytesmemoryview

    除了這個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 (strNone) [const char *]

s類似,但 Python 物件也可以是None,在這種情況下,C 指標被設定為NULL

z* (str, bytes-like objectNone) [Py_buffer]

類似於s*,但 Python 物件也可以是None,在這種情況下,Py_buffer結構的buf成員被設定為NULL

z# (str, 只讀 bytes-like objectNone) [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, bytesbytearray) [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, bytesbytearray) [const char *encoding, char **buffer, Py_ssize_t *buffer_length]

es#相同,只是位元組字串物件會直接傳遞,無需重新編碼。相反,實現假定位元組字串物件使用作為引數傳遞的編碼。

3.12 版本中的變化: u, u#, Z, 和 Z# 已被移除,因為它們使用了舊版的 Py_UNICODE* 表示。

數字

這些格式允許將 Python 數字或單個字元表示為 C 數字。需要intfloatcomplex的格式也可以使用相應的特殊方法__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 的bytesbytearray物件的 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引數將為NULLaddress將與原始呼叫中的值相同。

轉換器示例: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 序列(strbytesbytearray 除外),其長度為 items 中格式單元的數量。C 引數必須與 items 中的各個格式單元對應。序列的格式單元可以巢狀。

如果items包含儲存借用緩衝區s, s#, z, z#, y, 或 y#)或借用引用S, Y, U, O, 或 O!)的格式單元,則該物件必須是 Python 元組。itemsO&格式單元的轉換器不得儲存借用緩衝區或借用引用。

3.14 版本中的變化: strbytearray 物件不再接受作為序列。

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且不超過maxminmax可以相等。必須向函式傳遞額外的引數,每個引數都應該是指向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++ 預設為constconst char *const*)。要覆蓋,請在包含Python.h之前將其定義為所需值。

在 3.13 版本加入。

構建值

PyObject *Py_BuildValue(const char *format, ...)
返回值: 新引用。 穩定ABI 的一部分。

根據類似於PyArg_Parse*系列函式接受的格式字串和一系列值來建立新值。成功時返回該值;如果出錯,則返回NULL;如果返回NULL,將引發異常。

Py_BuildValue()並不總是構建元組。它僅在其格式字串包含兩個或更多格式單元時才構建元組。如果格式字串為空,它返回None;如果它只包含一個格式單元,它返回該格式單元所描述的任何物件。要強制它返回大小為 0 或 1 的元組,請將格式字串括起來。

當記憶體緩衝區作為引數傳遞以提供資料來構建物件時,例如對於ss#格式,所需資料會被複制。呼叫者提供的緩衝區絕不會被Py_BuildValue()建立的物件引用。換句話說,如果您的程式碼呼叫malloc()並將分配的記憶體傳遞給Py_BuildValue(),那麼一旦Py_BuildValue()返回,您的程式碼就有責任為該記憶體呼叫free()

在以下描述中,帶引號的形式是格式單元;(圓括號)中的條目是格式單元將返回的 Python 物件型別;[方括號]中的條目是要傳遞的 C 值型別。

格式字串中會忽略空格、製表符、冒號和逗號(但在s#等格式單元內則不會)。這可以用於使長格式字串更易讀。

s (strNone) [const char *]

使用'utf-8'編碼將以 null 結尾的 C 字串轉換為 Python str物件。如果 C 字串指標為NULL,則使用None

s# (strNone) [const char *, Py_ssize_t]

使用'utf-8'編碼將 C 字串及其長度轉換為 Python str物件。如果 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 (strNone) [const char *]

s相同。

z# (strNone) [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 (strNone) [const char *]

s相同。

U# (strNone) [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 而不是可變數量的引數。