<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### 導航 - [索引](../genindex.xhtml "總目錄") - [模塊](../py-modindex.xhtml "Python 模塊索引") | - [下一頁](conversion.xhtml "字符串轉換與格式化") | - [上一頁](marshal.xhtml "Data marshalling support") | - ![](https://box.kancloud.cn/a721fc7ec672275e257bbbfde49a4d4e_16x16.png) - [Python](https://www.python.org/) ? - zh\_CN 3.7.3 [文檔](../index.xhtml) ? - [Python/C API 參考手冊](index.xhtml) ? - [工具](utilities.xhtml) ? - $('.inline-search').show(0); | # 語句解釋及變量編譯 這些函數在創建你自己的函數時幫助很大。更多說明以及實例可參考說明文檔中的 [擴展和嵌入 Python 解釋器](../extending/index.xhtml#extending-index) 小節。 這些函數描述的前三個,[`PyArg_ParseTuple()`](#c.PyArg_ParseTuple "PyArg_ParseTuple"),[`PyArg_ParseTupleAndKeywords()`](#c.PyArg_ParseTupleAndKeywords "PyArg_ParseTupleAndKeywords"),以及 [`PyArg_Parse()`](#c.PyArg_Parse "PyArg_Parse"),它們都使用 *格式化字符串* 來將函數期待的參數告知函數。這些函數都使用相同語法規則的格式化字符串。 ## 解析參數 一個格式化字符串包含0或者更多的格式單元。一個格式單元用來描述一個Python對象;它通常是一個字符或者由括號括起來的格式單元序列。除了少數例外,一個非括號序列的格式單元通常對應這些函數的具有單一地址的參數。在接下來的描述中,雙引號內的表達式是格式單元;圓括號()內的是對應這個格式單元的Python對象類型;方括號\[\]內的是傳遞的C變量(變量集)類型。 ### 字符串和緩存區 這些格式允許將對象按照連續的內存塊形式進行訪問。你沒必要提供返回的unicode字符或者字節區的原始數據存儲。 一般的,當一個表達式設置一個指針指向一個緩沖區,這個緩沖區可以被相應的Python對象管理,并且這個緩沖區共享這個對象的生存周期。你不需要人為的釋放任何內存空間。除了這些 `es`, `es#`, `et` and `et#`. 然而,當一個 [`Py_buffer`](buffer.xhtml#c.Py_buffer "Py_buffer") 結構被賦值,其包含的緩沖區被鎖住,所以調用者在隨后使用這個緩沖區,即使在 [`Py_BEGIN_ALLOW_THREADS`](init.xhtml#c.Py_BEGIN_ALLOW_THREADS "Py_BEGIN_ALLOW_THREADS") 塊中,可以避免可變數據因為調整大小或者被銷毀所帶來的風險。因此,**你不得不調用** [`PyBuffer_Release()`](buffer.xhtml#c.PyBuffer_Release "PyBuffer_Release") 在你結束數據的處理時(或者在之前任何中斷事件中) 除非另有說明,緩沖區是不會以空終止的。 有些格式要求一個只讀的 [bytes-like object](../glossary.xhtml#term-bytes-like-object),并且設置一個指針以取代一個緩存區結構。它們通過檢查對象的 [`PyBufferProcs.bf_releasebuffer`](typeobj.xhtml#c.PyBufferProcs.bf_releasebuffer "PyBufferProcs.bf_releasebuffer") 字段是 *NULL* 來工作,它們不允許諸如 [`bytearray`](../library/stdtypes.xhtml#bytearray "bytearray") 這種可變的對象。 注解 所有 `#` 表達式的變式(`s#`,`y#`,等等),長度參數的類型(整型或者 `Py_ssize_t`)在包含 `Python.h` 頭文件之前由 `PY_SSIZE_T_CLEAN` 宏的定義控制。如果這個宏被定義,長度是一個 `Py_ssize_t` Python元大小類型而不是一個 `int` 整型。在未來的Python版本中將會改變,只支持 `Py_ssize_t` 而放棄支持 `int` 整型。最好一直定義 `PY_SSIZE_T_CLEAN` 這個宏。 `s` ([`str`](../library/stdtypes.xhtml#str "str")) \[const char \*\]將一個Unicode對象轉換成一個指向字符串的C指針。一個指針指向一個已經存在的字符串,這個字符串存儲的是傳如的字符指針變量。C字符串是已空結束的。Python字符串不能包含嵌入的無效的代碼點;如果由,一個 [`ValueError`](../library/exceptions.xhtml#ValueError "ValueError") 異常會被引發。Unicode對象被轉化成 `'utf-8'` 編碼的C字符串。如果轉換失敗,一個 [`UnicodeError`](../library/exceptions.xhtml#UnicodeError "UnicodeError") 異常被引發。 注解 這個表達式不接受 [bytes-like objects](../glossary.xhtml#term-bytes-like-object)。如果你想接受文件系統路徑并將它們轉化成C字符串,建議使用 `O&` 表達式配合 [`PyUnicode_FSConverter()`](unicode.xhtml#c.PyUnicode_FSConverter "PyUnicode_FSConverter") 作為 *轉化函數*。 在 3.5 版更改: 以前,當Python字符串中遇到了嵌入的null代碼點會引發 [`TypeError`](../library/exceptions.xhtml#TypeError "TypeError") 。 `s*` ([`str`](../library/stdtypes.xhtml#str "str") or [bytes-like object](../glossary.xhtml#term-bytes-like-object)) \[Py\_buffer\]這個表達式既接受Unicode對象也接受類字節類型對象。它為由調用者提供的 [`Py_buffer`](buffer.xhtml#c.Py_buffer "Py_buffer") 結構賦值。這里結果的C字符串可能包含嵌入的NUL字節。Unicode對象通過 `'utf-8'` 編碼轉化成C字符串。 `s#` ([`str`](../library/stdtypes.xhtml#str "str"), 只讀 [bytes-like object](../glossary.xhtml#term-bytes-like-object)) \[const char \*, int or `Py_ssize_t`\]像 `s*`,除了它不接受易變的對象。結果存儲在兩個C 變量中,第一個是指向C字符串的指針,第二個是它的長度。字符串可能包含嵌入的null字節。Unicode對象都被通過 `'utf-8'` 編碼轉化成C字符串。 `z` ([`str`](../library/stdtypes.xhtml#str "str") or `None`) \[const char \*\]像 `s`,但是這個Python對象也有可能是 `None`,那么對應的C指針指向 *NULL*。 `z*` ([`str`](../library/stdtypes.xhtml#str "str"), [bytes-like object](../glossary.xhtml#term-bytes-like-object) or `None`) \[Py\_buffer\]像 `s*`,但是這個Python對象也有可能是 `None`,那么對應的 [`Py_buffer`](buffer.xhtml#c.Py_buffer "Py_buffer") 結構中的 `buf` 指向 *NULL*。 `z#` ([`str`](../library/stdtypes.xhtml#str "str"), 只讀 [bytes-like object](../glossary.xhtml#term-bytes-like-object) or `None`) \[const char \*, int\]像 `s#`,但是這個Python對象也有可能是 `None`,那么對應的C指針指向 *NULL*。 `y` (read-only [bytes-like object](../glossary.xhtml#term-bytes-like-object)) \[const char \*\]這個表達式將一個類字節類型對象轉化成一個指向字符串的C指針;它不接受Unicode對象。字節緩存區必須不包含嵌入的null字節;如果包含了null字節,會引發一個 [`ValueError`](../library/exceptions.xhtml#ValueError "ValueError") 異常。 在 3.5 版更改: 以前,當字節緩沖區中遇到了嵌入的null字節會引發 [`TypeError`](../library/exceptions.xhtml#TypeError "TypeError") 。 `y*` ([bytes-like object](../glossary.xhtml#term-bytes-like-object)) \[Py\_buffer\]`s*` 的變式,不接受Unicode對象,只接受類字節類型變量。**這是接受二進制數據的推薦方法**。 `y#` (read-only [bytes-like object](../glossary.xhtml#term-bytes-like-object)) \[const char \*, int\]This variant on `s#` doesn't accept Unicode objects, only bytes-like objects. `S` ([`bytes`](../library/stdtypes.xhtml#bytes "bytes")) \[PyBytesObject \*\]要求Python對象是一個 [`bytes`](../library/stdtypes.xhtml#bytes "bytes") 類型對象,沒有嘗試任何的轉換。如果不是一個字節類型對象會引發 [`TypeError`](../library/exceptions.xhtml#TypeError "TypeError") 異常。C變量也可能聲明為 [`PyObject*`](structures.xhtml#c.PyObject "PyObject") 類型。 `Y` ([`bytearray`](../library/stdtypes.xhtml#bytearray "bytearray")) \[PyByteArrayObject \*\]要求Python對象是一個 [`bytearray`](../library/stdtypes.xhtml#bytearray "bytearray") 類型對象,沒有嘗試任何的轉換。如果不是一個 [`bytearray`](../library/stdtypes.xhtml#bytearray "bytearray") 類型對象會引發 [`TypeError`](../library/exceptions.xhtml#TypeError "TypeError") 異常。C變量也可能聲明為 [`PyObject*`](structures.xhtml#c.PyObject "PyObject") 類型。 `u` ([`str`](../library/stdtypes.xhtml#str "str")) \[const Py\_UNICODE \*\]將一個Python Unicode對象轉化成指向一個以空終止的Unicode字符緩沖區的指針。你必須傳入一個 [`Py_UNICODE`](unicode.xhtml#c.Py_UNICODE "Py_UNICODE") 指針變量的地址,存儲了一個指向已經存在的Unicode緩沖區的指針。請注意一個 [`Py_UNICODE`](unicode.xhtml#c.Py_UNICODE "Py_UNICODE") 類型的字符寬度取決于編譯選項(16位或者32位)。Python字符串必須不能包含嵌入的null代碼點;如果有,引發一個 [`ValueError`](../library/exceptions.xhtml#ValueError "ValueError") 異常。 在 3.5 版更改: 以前,當Python字符串中遇到了嵌入的null代碼點會引發 [`TypeError`](../library/exceptions.xhtml#TypeError "TypeError") 。 Deprecated since version 3.3, will be removed in version 4.0: 這是舊版樣式 [`Py_UNICODE`](unicode.xhtml#c.Py_UNICODE "Py_UNICODE") API; 請遷移至 [`PyUnicode_AsWideCharString()`](unicode.xhtml#c.PyUnicode_AsWideCharString "PyUnicode_AsWideCharString"). `u#` ([`str`](../library/stdtypes.xhtml#str "str")) \[const Py\_UNICODE \*, int\]`u` 的變式,存儲兩個C變量,第一個指針指向一個Unicode數據緩存區,第二個是它的長度。它允許null代碼點。 Deprecated since version 3.3, will be removed in version 4.0: 這是舊版樣式 [`Py_UNICODE`](unicode.xhtml#c.Py_UNICODE "Py_UNICODE") API; 請遷移至 [`PyUnicode_AsWideCharString()`](unicode.xhtml#c.PyUnicode_AsWideCharString "PyUnicode_AsWideCharString"). `Z` ([`str`](../library/stdtypes.xhtml#str "str") 或 `None`) \[const Py\_UNICODE \*\]像 `u`,但是這個Python對象也有可能是 `None`,那么對應的 [`Py_UNICODE`](unicode.xhtml#c.Py_UNICODE "Py_UNICODE") 指針指向 *NULL*。 Deprecated since version 3.3, will be removed in version 4.0: 這是舊版樣式 [`Py_UNICODE`](unicode.xhtml#c.Py_UNICODE "Py_UNICODE") API; 請遷移至 [`PyUnicode_AsWideCharString()`](unicode.xhtml#c.PyUnicode_AsWideCharString "PyUnicode_AsWideCharString"). `Z#` ([`str`](../library/stdtypes.xhtml#str "str") 或 `None`) \[const Py\_UNICODE \*, int\]像 `u#`,但是這個Python對象也有可能是 `None`,那么對應的 [`Py_UNICODE`](unicode.xhtml#c.Py_UNICODE "Py_UNICODE") 指針指向 *NULL*。 Deprecated since version 3.3, will be removed in version 4.0: 這是舊版樣式 [`Py_UNICODE`](unicode.xhtml#c.Py_UNICODE "Py_UNICODE") API; 請遷移至 [`PyUnicode_AsWideCharString()`](unicode.xhtml#c.PyUnicode_AsWideCharString "PyUnicode_AsWideCharString"). `U` ([`str`](../library/stdtypes.xhtml#str "str")) \[PyObject \*\]要求Python對象是一個Unicode對象,沒有嘗試任何的轉換。如果不是一個Unicode對象會引發 [`TypeError`](../library/exceptions.xhtml#TypeError "TypeError") 異常。C變量也可能聲明為 [`PyObject*`](structures.xhtml#c.PyObject "PyObject") 類型。 `w*` (可讀寫 [bytes-like object](../glossary.xhtml#term-bytes-like-object)) \[Py\_buffer\]這個表達式接受任何實現可讀寫緩存區接口的對象。它為調用者提供的 [`Py_buffer`](buffer.xhtml#c.Py_buffer "Py_buffer") 結構賦值。緩沖區可能存在嵌入的null字節。當緩沖區使用完后調用者需要調用 [`PyBuffer_Release()`](buffer.xhtml#c.PyBuffer_Release "PyBuffer_Release")。 `es` ([`str`](../library/stdtypes.xhtml#str "str")) \[const char \*encoding, char \*\*buffer\]`s` 的變式,它將編碼后的Unicode字符存入字符緩沖區。它只處理沒有嵌入NUL字節的已編碼數據 這個表達式需要兩個參數。第一個僅用于傳入,并且必須是一個 `const char*` 指向一個 `'utf-8'` 編碼的以空終止或者 *NULL* 的字符串名稱。如果Python不識別名字的編碼方式會引發一個異常。第二個參數必須是一個 `char**`;指針指向一個包含了參數文本內容的緩存區。文本將被第一個參數指定的編碼格式編碼。 [`PyArg_ParseTuple()`](#c.PyArg_ParseTuple "PyArg_ParseTuple") 會分配一個足夠大小的緩沖區,將編碼后的數據拷貝進這個緩沖區并且設置 *\*buffer* 引用這個新分配的內存空間。調用者有責任在使用后調用 [`PyMem_Free()`](memory.xhtml#c.PyMem_Free "PyMem_Free") 去釋放已經分配的緩沖區。 `et` ([`str`](../library/stdtypes.xhtml#str "str"), [`bytes`](../library/stdtypes.xhtml#bytes "bytes") or [`bytearray`](../library/stdtypes.xhtml#bytearray "bytearray")) \[const char \*encoding, char \*\*buffer\]和 `es` 相同,除了不用重編碼傳入的字符串對象。相反,它假設傳入的參數是編碼后的字符串類型。 `es#` ([`str`](../library/stdtypes.xhtml#str "str")) \[const char \*encoding, char \*\*buffer, int \*buffer\_length\]`s#` 的變式,它將已編碼的Unicode字符存入字符緩沖區。不像 `es` 表達式,它允許傳入的數據包含NUL字符。 它需要三個參數。第一個僅用于傳入,并且必須是一個 `const char*` 指向一個 `'utf-8'` 編碼的以空終止或者 *NULL* 的字符串名稱。如果Python不識別名字的編碼方式會引發一個異常。第二個參數必須是一個 `char**`;指針指向一個包含了參數文本內容的緩存區。文本將被第一個參數指定的編碼格式編碼。第三個參數必須是一個整型指針;指針引用的值用來設定輸出緩沖區的字節數量。 有兩種操作方式: 如果 *\*buffer* 指向 *NULL*,這個函數會分配一個足夠大小的緩沖區,將編碼后的數據拷貝進這個緩沖區并且設置 *\*buffer* 引用這個新分配的內存空間。調用者有責任在使用后調用 [`PyMem_Free()`](memory.xhtml#c.PyMem_Free "PyMem_Free") 去釋放已經分配的緩沖區。 如果 *\*buffer* 指向一個非 *NULL* 的指針(一個已經分配內存的緩沖區), [`PyArg_ParseTuple()`](#c.PyArg_ParseTuple "PyArg_ParseTuple") 將使用這個地址作為緩沖區并且將 *\*buffer\_length* 初始化的值理解為緩沖區的大小。然后它將編碼后的數據拷貝到緩沖區并以空終止。如果這個緩沖區并不是足夠大,一個 [`TypeError`](../library/exceptions.xhtml#TypeError "TypeError") 會被設置。 在這兩個例子中,*\*buffer\_length* 被設置為編碼后結尾不為NUL的數據的長度。 `et#` ([`str`](../library/stdtypes.xhtml#str "str"), [`bytes`](../library/stdtypes.xhtml#bytes "bytes") or [`bytearray`](../library/stdtypes.xhtml#bytearray "bytearray")) \[const char \*encoding, char \*\*buffer, int \*buffer\_length\]和 `es#` 相同,除了不用重編碼傳入的字符串對象。相反,它假設傳入的參數是編碼后的字符串類型。 ### 數字 `b` ([`int`](../library/functions.xhtml#int "int")) \[unsigned char\]將一個非負的Python整型轉化成一個無符號的微整型,存儲在一個C `unsigned char` 類型中。 `B` ([`int`](../library/functions.xhtml#int "int")) \[unsigned char\]將一個Python整型轉化成一個微整型并不檢查溢出問題,存儲在一個C `unsigned char` 類型中。 `h` ([`int`](../library/functions.xhtml#int "int")) \[short int\]將一個Python整型轉化成一個C `short int` 短整型。 `H` ([`int`](../library/functions.xhtml#int "int")) \[unsigned short int\]將一個Python整型轉化成一個C `unsigned short int` 無符號短整型,并不檢查溢出問題。 `i` ([`int`](../library/functions.xhtml#int "int")) \[int\]將一個Python整型轉化成一個C `int` 整型。 `I` ([`int`](../library/functions.xhtml#int "int")) \[unsigned int\]將一個Python整型轉化成一個C `unsigned int` 無符號整型,并不檢查溢出問題。 `l` ([`int`](../library/functions.xhtml#int "int")) \[long int\]將一個Python整型轉化成一個C `long int` 長整型。 `k` ([`int`](../library/functions.xhtml#int "int")) \[unsigned long\]將一個Python整型轉化成一個C `unsigned long int` 無符號長整型,并不檢查溢出問題。 `L` ([`int`](../library/functions.xhtml#int "int")) \[long long\]將一個Python整型轉化成一個C `long long` 長長整型。 `K` ([`int`](../library/functions.xhtml#int "int")) \[unsigned long long\]將一個Python整型轉化成一個C `unsigned long long` 無符號長長整型,并不檢查溢出問題。 `n` ([`int`](../library/functions.xhtml#int "int")) \[Py\_ssize\_t\]將一個Python整型轉化成一個C `Py_ssize_t` Python元大小類型。 `c` ([`bytes`](../library/stdtypes.xhtml#bytes "bytes") 或者 [`bytearray`](../library/stdtypes.xhtml#bytearray "bytearray") 長度為1) \[char\]將一個Python字節類型,如一個長度為1的 [`bytes`](../library/stdtypes.xhtml#bytes "bytes") 或者 [`bytearray`](../library/stdtypes.xhtml#bytearray "bytearray") 對象,轉化成一個C `char` 字符類型。 在 3.3 版更改: 允許 [`bytearray`](../library/stdtypes.xhtml#bytearray "bytearray") 類型的對象。 `C` ([`str`](../library/stdtypes.xhtml#str "str") 長度為1) \[int\]將一個Python字符,如一個長度為1的 [`str`](../library/stdtypes.xhtml#str "str") 字符串對象,轉化成一個C `int` 整型類型。 `f` ([`float`](../library/functions.xhtml#float "float")) \[float\]將一個Python浮點數轉化成一個C `float` 浮點數。 `d` ([`float`](../library/functions.xhtml#float "float")) \[double\]將一個Python浮點數轉化成一個C `double` 雙精度浮點數。 `D` ([`complex`](../library/functions.xhtml#complex "complex")) \[Py\_complex\]將一個Python復數類型轉化成一個C [`Py_complex`](complex.xhtml#c.Py_complex "Py_complex") Python復數類型。 ### 其他對象 `O` (object) \[PyObject \*\]用一個C的對象指針存儲一個Python對象(沒有任何格式轉換)。這樣傳遞給C程序的是實際的對象。這個對象的引用計數不會增加。這個指針存儲的不是 *NULL*。 `O!` (object) \[*typeobject*, PyObject \*\]將一個Python對象存入一個C指針。和 `O` 類似,但是需要兩個C參數:第一個是Python類型對象的地址,第二個是存儲對象指針的C變量( [`PyObject*`](structures.xhtml#c.PyObject "PyObject") 變量)的地址。如果Python對象類型不對,會拋出 [`TypeError`](../library/exceptions.xhtml#TypeError "TypeError") 異常。 `O&` (object) \[*converter*, *anything*\]通過一個 *converter* 函數將一個Python對象轉換成一個C變量。這需要兩個參數:第一個是一個函數,第二個是一個C變量的地址(任意類型的),轉化為 `void *` 類型。*converter* 函數像這樣被調用: ``` status = converter(object, address); ``` *object\*是待轉化的Python對象并且 \*address* 是傳入 [`PyArg_Parse*()`](#c.PyArg_Parse "PyArg_Parse") 函數的 `void*` 類型參數。返回的 *status* 是1代表轉換成功,0代表轉換失敗。當轉換失敗,*converter\*函數會引發一個異常并且不會修改 \*address* 的內容。 如果 *converter* 返回 `Py_CLEANUP_SUPPORTED`,如果參數解析最后失敗了它會被第二次調用,給轉換函數一個機會區釋放它已經分配的內存。在第二次調用中, *object* 參數會是NULL; *address* 會保持第一次調用時的值。 在 3.1 版更改: `Py_CLEANUP_SUPPORTED` 被添加。 `p` ([`bool`](../library/functions.xhtml#bool "bool")) \[int\]測試傳入的值是否為真(一個布爾判斷)并且將結果轉化為相對應的C true/false整型值。如果表達式為真置``1``,假則置``0``。它接受任何合法的Python值。參見 [邏輯值檢測](../library/stdtypes.xhtml#truth) 獲取更多關于Python如何測試值為真的信息。 3\.3 新版功能. `(items)` ([`tuple`](../library/stdtypes.xhtml#tuple "tuple")) \[*matching-items*\]對象必須是Python序列,它的長度是 *items* 中格式單元的數量。C參數必須對應 *items* 中每一個獨立的格式單元。序列中的格式單元可能有嵌套。 傳遞 “長”整型(整型的值超過了平臺的 `LONG_MAX` 限制)是可能的,然而沒有進行適當的范圍檢測——當接收字段太小而接收不到值時,最重要的位被靜默地截斷(實際上,C語言會在語義繼承的基礎上強制類型轉換——期望的值可能會發生變化)。 格式化字符串中還有一些其他的字符具有特殊的涵義。這些可能并不嵌套在圓括號中。它們是: `|`表明在Python參數列表中剩下的參數都是可選的。C變量對應的可選參數需要初始化為默認值——當一個可選參數沒有指定時, [`PyArg_ParseTuple()`](#c.PyArg_ParseTuple "PyArg_ParseTuple") 不能訪問相應的C變量(變量集)的內容。 `$`[`PyArg_ParseTupleAndKeywords()`](#c.PyArg_ParseTupleAndKeywords "PyArg_ParseTupleAndKeywords") only:表明在Python參數列表中剩下的參數都是強制關鍵字參數。當前,所有強制關鍵字參數都必須也是可選參數,所以格式化字符串中 `|` 必須一直在 `$` 前面。 3\.3 新版功能. `:`格式單元的列表結束標志;冒號后的字符串被用來作為錯誤消息中的函數名([`PyArg_ParseTuple()`](#c.PyArg_ParseTuple "PyArg_ParseTuple") 函數引發的“關聯值”異常)。 `;`格式單元的列表結束標志;分號后的字符串被用來作為錯誤消息取代默認的錯誤消息。 `:` 和 `;` 相互排斥。 注意任何由調用者提供的Python對象引用是 *借來的* 引用;不要遞減它們的引用計數! 傳遞給這些函數的附加參數必須是由格式化字符串確定的變量的地址;這些都是用來存儲輸入元組的值。有一些情況,如上面的格式單元列表中所描述的,這些參數作為輸入值使用;在這種情況下,它們應該匹配指定的相應的格式單元。 為了轉換成功,*arg* 對象必須匹配格式并且格式必須用盡。成功的話,[`PyArg_Parse*()`](#c.PyArg_Parse "PyArg_Parse") 函數返回true,反之它們返回false并且引發一個合適的異常。當 [`PyArg_Parse*()`](#c.PyArg_Parse "PyArg_Parse") 函數因為某一個格式單元轉化失敗而失敗時,對應的以及后續的格式單元地址內的變量都不會被使用。 ### API 函數 int `PyArg_ParseTuple`([PyObject](structures.xhtml#c.PyObject "PyObject") *\*args*, const char *\*format*, ...)解析一個函數的參數,表達式中的參數按參數位置順序存入局部變量中。成功返回true;失敗返回false并且引發相應的異常。 int `PyArg_VaParse`([PyObject](structures.xhtml#c.PyObject "PyObject") *\*args*, const char *\*format*, va\_list *vargs*)和 [`PyArg_ParseTuple()`](#c.PyArg_ParseTuple "PyArg_ParseTuple") 相同,然而它接受一個va\_list類型的參數而不是可變數量的參數集。 int `PyArg_ParseTupleAndKeywords`([PyObject](structures.xhtml#c.PyObject "PyObject") *\*args*, [PyObject](structures.xhtml#c.PyObject "PyObject") *\*kw*, const char *\*format*, char *\*keywords\[\]*, ...)解析一個函數的參數,關鍵字參數和表達式中的參數按參數位置順序存入局部變量中。其中\*keywords\*參數是一個以空結束的數組,存放關鍵字參數的名稱。空的名稱表示為 [positional-only parameters](../glossary.xhtml#positional-only-parameter) 。成功返回true;失敗返回false并且引發相應的異常。 在 3.6 版更改: 添加了 [positional-only parameters](../glossary.xhtml#positional-only-parameter) 的支持。 int `PyArg_VaParseTupleAndKeywords`([PyObject](structures.xhtml#c.PyObject "PyObject") *\*args*, [PyObject](structures.xhtml#c.PyObject "PyObject") *\*kw*, const char *\*format*, char *\*keywords\[\]*, va\_list *vargs*)和 [`PyArg_ParseTupleAndKeywords()`](#c.PyArg_ParseTupleAndKeywords "PyArg_ParseTupleAndKeywords") 相同,然而它接受一個va\_list類型的參數而不是可變數量的參數集。 int `PyArg_ValidateKeywordArguments`([PyObject](structures.xhtml#c.PyObject "PyObject") *\**)確保字典中的關鍵字參數都是字符串。這個函數只被使用于 [`PyArg_ParseTupleAndKeywords()`](#c.PyArg_ParseTupleAndKeywords "PyArg_ParseTupleAndKeywords") 不被使用的情況下,后者已經不再做這樣的檢查。 3\.2 新版功能. int `PyArg_Parse`([PyObject](structures.xhtml#c.PyObject "PyObject") *\*args*, const char *\*format*, ...)函數被用來析構“舊類型”函數的參數列表——這些函數使用的 `METH_OLDARGS` 參數解析方法已從Python 3中移除。這不被推薦用于新代碼的參數解析,并且在標準解釋器中的大多數代碼已被修改,已不再用于該目的。它仍然方便于分解其他元組,然而可能因為這個目的被繼續使用。 int `PyArg_UnpackTuple`([PyObject](structures.xhtml#c.PyObject "PyObject") *\*args*, const char *\*name*, Py\_ssize\_t *min*, Py\_ssize\_t *max*, ...)一個不使用格式化字符串指定參數類型的簡單形式的參數檢索。使用這種方法來檢索參數的函數應該在函數或者方法表中聲明 [`METH_VARARGS`](structures.xhtml#METH_VARARGS "METH_VARARGS")。包含實際參數的元組應該以 *args* 形式被傳入;它必須是一個實際的元組。元組的長度必須至少是 *min* 并且不超過 *max*; *min* 和 *max* 可能相同。額外的參數必須傳遞給函數,每一個參數必須是一個指向 [`PyObject*`](structures.xhtml#c.PyObject "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()`](#c.PyArg_UnpackTuple "PyArg_UnpackTuple") 完全等價于調用 [`PyArg_ParseTuple()`](#c.PyArg_ParseTuple "PyArg_ParseTuple"): ``` PyArg_ParseTuple(args, "O|O:ref", &object, &callback) ``` ## 創建變量 [PyObject](structures.xhtml#c.PyObject "PyObject")\* `Py_BuildValue`(const char *\*format*, ...)*Return value: New reference.*基于格式化字符串創建一個新的值和那些 [`PyArg_Parse*()`](#c.PyArg_Parse "PyArg_Parse") 函數族接受的函數及一系列值類似。返回這個值或者一旦出錯返回 *NULL*;如果返回的是 *NULL* 會引發一個異常。 [`Py_BuildValue()`](#c.Py_BuildValue "Py_BuildValue") 并不一直創建一個元組。只有當它的格式化字符串包含兩個或更多的格式單元才會創建一個元組。如果格式化字符串是空,它返回 `None`;如果它包含一個格式單元,它返回由格式單元描述的的任一對象。用圓括號包裹格式化字符串可以強制它返回一個大小為0或者1的元組 當內存緩存區的數據以參數形式傳遞用來構建對象時,如 `s` 和 `s#` 格式單元,會拷貝需要的數據。調用者提供的緩沖區從來都不會被由 [`Py_BuildValue()`](#c.Py_BuildValue "Py_BuildValue") 創建的對象來引用。換句話說,如果你的代碼調用 `malloc()` 并且將分配的內存空間傳遞給 [`Py_BuildValue()`](#c.Py_BuildValue "Py_BuildValue"),你的代碼就有責任在 [`Py_BuildValue()`](#c.Py_BuildValue "Py_BuildValue") 返回時調用 `free()` 。 在下面的描述中,雙引號的表達式使格式單元;圓括號()內的是格式單元將要返回的Python對象類型;方括號\[\]內的是傳遞的C變量(變量集)的類型 字符例如空格,制表符,冒號和逗號在格式化字符串中會被忽略(但是不包括格式單元,如 `s#`)。這可以使很長的格式化字符串具有更好的可讀性。 `s` ([`str`](../library/stdtypes.xhtml#str "str") 或 `None`) \[const char \*\]使用 `'utf-8'` 編碼將一個C以空結束的字符串轉化成Python [`str`](../library/stdtypes.xhtml#str "str") 字符串對象。如果這個C字符串指針是 *NULL* ,返回 `None` 。 `s#` ([`str`](../library/stdtypes.xhtml#str "str") 或 `None`) \[const char \*, int\]使用 `'utf-8'` 編碼將一個C字符串和其長度轉化成Python [`str`](../library/stdtypes.xhtml#str "str") 字符串對象。如果這個C字符串指針是 *NULL* ,長度會被忽略并且返回 `None` 。 `y` ([`bytes`](../library/stdtypes.xhtml#bytes "bytes")) \[const char \*\]它將一個C字符串和其長度轉化成一個Python [`bytes`](../library/stdtypes.xhtml#bytes "bytes") 字節類型對象。如果這個C字符串指針是 *NULL*,返回``None`` `y#` ([`bytes`](../library/stdtypes.xhtml#bytes "bytes")) \[const char \*, int\]它將一個C字符串和其長度轉化成一個Python對象。如果這個C字符串指針是 *NULL*,返回``None``。 `z` ([`str`](../library/stdtypes.xhtml#str "str") or `None`) \[const char \*\]和``s``一樣。 `z#` ([`str`](../library/stdtypes.xhtml#str "str") 或 `None`) \[const char \*, int\]和``s#``一樣。 `u` ([`str`](../library/stdtypes.xhtml#str "str")) \[const wchar\_t \*\]將一個以 null 結束的 `wchar_t` Unicode (UTF-16 或 UCS-4) 數據緩沖區轉換為一個 Python Unicode 對象。如果 Unicode 緩沖區指針為 *NULL* 則返回 `None`。 `u#` ([`str`](../library/stdtypes.xhtml#str "str")) \[const wchar\_t \*, int\]將一個 Unicode (UTF-16 或 UCS-4) 數據緩沖區及其長度轉換為一個 Python Unicode 對象。如果 Unicode 緩沖區指針為 *NULL* 則忽略長度并返回 `None`。 `U` ([`str`](../library/stdtypes.xhtml#str "str") 或 `None`) \[const char \*\]和``s``一樣。 `U#` ([`str`](../library/stdtypes.xhtml#str "str") 或 `None`) \[const char \*, int\]和``s#``一樣。 `i` ([`int`](../library/functions.xhtml#int "int")) \[int\]將一個C `int` 整型轉化成Python整型對象。 `b` ([`int`](../library/functions.xhtml#int "int")) \[char\]將一個C `char` 字符型轉化成Python整型對象。 `h` ([`int`](../library/functions.xhtml#int "int")) \[short int\]將一個C `short int` 短整型轉化成Python整型對象。 `l` ([`int`](../library/functions.xhtml#int "int")) \[long int\]將一個C `long int` 長整型轉化成Python整型對象。 `B` ([`int`](../library/functions.xhtml#int "int")) \[unsigned char\]將一個C `unsigned char` 無符號字符型轉化成Python整型對象。 `H` ([`int`](../library/functions.xhtml#int "int")) \[unsigned short int\]將一個C `unsigned long` 無符號短整型轉化成Python整型對象。 `I` ([`int`](../library/functions.xhtml#int "int")) \[unsigned int\]將一個C `unsigned long` 無符號整型轉化成Python整型對象。 `k` ([`int`](../library/functions.xhtml#int "int")) \[unsigned long\]將一個C `unsigned long` 無符號長整型轉化成Python整型對象。 `L` ([`int`](../library/functions.xhtml#int "int")) \[long long\]將一個C `long long` 長長整形轉化成Python整形對象。 `K` ([`int`](../library/functions.xhtml#int "int")) \[unsigned long long\]將一個C `unsigned long long` 無符號長長整型轉化成Python整型對象。 `n` ([`int`](../library/functions.xhtml#int "int")) \[Py\_ssize\_t\]將一個C `Py_ssize_t` 類型轉化為Python整型。 `c` ([`bytes`](../library/stdtypes.xhtml#bytes "bytes") 長度為1 ) \[char\]將一個C `int` 整型代表的字符轉化為Python [`bytes`](../library/stdtypes.xhtml#bytes "bytes") 長度為1的字節對象。 `C` ([`str`](../library/stdtypes.xhtml#str "str") 長度為1) \[int\]將一個C `int` 整型代表的字符轉化為Python [`str`](../library/stdtypes.xhtml#str "str") 長度為1的字符串對象。 `d` ([`float`](../library/functions.xhtml#float "float")) \[double\]將一個C `double` 雙精度浮點數轉化為Python浮點數類型數字。 `f` ([`float`](../library/functions.xhtml#float "float")) \[float\]將一個C `float` 單精度浮點數轉化為Python浮點數類型數字。 `D` (`復數`) \[Py\_complex \*\]將一個C [`Py_complex`](complex.xhtml#c.Py_complex "Py_complex") 類型的結構轉化為Python復數類型。 `O` (object) \[PyObject \*\]接受一個不變的Python對象(除了它的引用計數,引用計數會遞增1)。如果傳入的對象是一個 *NULL* 指針,會假設這是因為調用傳遞了錯誤的參數并且拋出異常。因此 [`Py_BuildValue()`](#c.Py_BuildValue "Py_BuildValue") 會返回 *NULL* 但是不會引發異常。如果沒有引發異常,[`SystemError`](../library/exceptions.xhtml#SystemError "SystemError") 會被設置。 `S` (object) \[PyObject \*\]和``O``相同。 `N` (object) \[PyObject \*\]和``O``相同,然而它并不增加對象的引用計數。當通過調用參數列表中的對象構造器創建對象時很實用。 `O&` (object) \[*converter*, *anything*\]通過 *converter* 函數將 *任何類型的變量\*轉化為一個Python對象。這個函數調用 \*任何類型的變量* (這個類型可以被 `void *` 兼容) 作為它的參數,并且應該返回一個"新的"Python對象,或者 *NULL* 如果有錯誤產生。 `(items)` ([`tuple`](../library/stdtypes.xhtml#tuple "tuple")) \[*matching-items*\]將一個C變量序列轉換成Python元組并保持相同的元素數量 `[items]` ([`list`](../library/stdtypes.xhtml#list "list")) \[*相關的元素*\]將一個C變量序列轉換成Python列表并保持相同的元素數量 `{items}` ([`dict`](../library/stdtypes.xhtml#dict "dict")) \[*相關的元素*\]將一個C變量序列轉換成Python字典。每一對連續的C變量對作為一個元素插入字典中,分別作為關鍵字和值。 如果格式化字符串中有一個錯誤,異常 [`SystemError`](../library/exceptions.xhtml#SystemError "SystemError") 會被設置并且返回 *NULL* 。 [PyObject](structures.xhtml#c.PyObject "PyObject")\* `Py_VaBuildValue`(const char *\*format*, va\_list *vargs*)*Return value: New reference.*和 [`Py_BuildValue()`](#c.Py_BuildValue "Py_BuildValue") 相同,然而它接受一個va\_list類型的參數而不是可變數量的參數集。 ### 導航 - [索引](../genindex.xhtml "總目錄") - [模塊](../py-modindex.xhtml "Python 模塊索引") | - [下一頁](conversion.xhtml "字符串轉換與格式化") | - [上一頁](marshal.xhtml "Data marshalling support") | - ![](https://box.kancloud.cn/a721fc7ec672275e257bbbfde49a4d4e_16x16.png) - [Python](https://www.python.org/) ? - zh\_CN 3.7.3 [文檔](../index.xhtml) ? - [Python/C API 參考手冊](index.xhtml) ? - [工具](utilities.xhtml) ? - $('.inline-search').show(0); | ? [版權所有](../copyright.xhtml) 2001-2019, Python Software Foundation. Python 軟件基金會是一個非盈利組織。 [請捐助。](https://www.python.org/psf/donations/) 最后更新于 5月 21, 2019. [發現了問題](../bugs.xhtml)? 使用[Sphinx](http://sphinx.pocoo.org/)1.8.4 創建。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看