Разбор аргументов и построение значений¶Parsing arguments and building values
Эти функции полезны при создании собственных функций и методов расширений. Дополнительная информация и примеры доступны в Расширение и встраивание интерпретатора Python.
Первые три из описанных функций, PyArg_ParseTuple(),
PyArg_ParseTupleAndKeywords() и PyArg_Parse(), используют
строки формата, которые сообщают функции об ожидаемых аргументах. Строки формата используют один и тот же синтаксис для каждой из этих функций.
Строка формата состоит из нуля или более «единиц формата». Единица формата описывает один объект Python; обычно это один символ или заключенная в скобки последовательность единиц формата. За некоторыми исключениями, единица формата, не являющаяся заключенной в скобки последовательностью, обычно соответствует одному адресному аргументу этих функций. В приведенном ниже описании выделенная кавычками форма – это единица формата; запись в круглых скобках – это тип объекта Python, соответствующий единице формата; а запись в квадратных скобках – это тип переменной (или переменных) C, адрес которой (которых) следует передать.
Эти форматы позволяют обращаться к объекту как к непрерывному блоку памяти.
Не нужно предоставлять сырую память для возвращаемой области Unicode или bytes.
Также не нужно самостоятельно освобождать память, за исключением форматов
es, es#, et и et#.
s(строка или Unicode) [const char *]Преобразует строку Python или объект Unicode в указатель C на строку символов. Не нужно выделять память для самой строки; указатель на существующую строку сохраняется в переменную-указатель на символы, адрес которой передается. Строка C завершается NUL. Строка Python не должна содержать встроенных NUL-байтов; если они есть, возбуждается исключение
TypeError. Объекты Unicode преобразуются в строки C с использованием кодировки по умолчанию. Если такое преобразование не удается, возбуждаетсяUnicodeError.s#(строка, Unicode или любой объект, совместимый с read buffer) [const char *, int (илиPy_ssize_t, см. ниже)]Этот вариант
sсохраняет значения в две переменные C: первая – указатель на строку символов, вторая – ее длина. В этом случае строка Python может содержать встроенные нулевые байты. Объекты Unicode возвращают указатель на версию объекта, закодированную в кодировке по умолчанию, если такое преобразование возможно. Все остальные объекты, совместимые с read buffer, возвращают ссылку на сырое внутреннее представление данных.Начиная с Python 2.5, тип аргумента длины можно контролировать, определив макрос
PY_SSIZE_T_CLEANдо включенияPython.h. Если макрос определен, length являетсяPy_ssize_t, а не int.s*(строка, Unicode или любой объект, совместимый с буфером) [Py_buffer]Аналогично
s#, этот код заполняет структуру Py_buffer, предоставленную вызывающей стороной. Буфер блокируется, так что вызывающая сторона может затем использовать буфер даже внутри блокаPy_BEGIN_ALLOW_THREADS; вызывающая сторона обязана вызватьPyBuffer_Releaseсо структурой после обработки данных.Новое в версии 2.6.
z(строка, Unicode илиNone) [const char *]Как
s, но объект Python также может бытьNone, и в этом случае указатель C устанавливается в NULL.z#(строка, Unicode,Noneили любой объект, совместимый с read buffer) [const char *, int]Это относится к
s#так же, какzотносится кs.z*(строка, Unicode,Noneили любой объект, совместимый с буфером) [Py_buffer]Это относится к
s*так же, какzотносится кs.Новое в версии 2.6.
u(Unicode) [Py_UNICODE *]Преобразует объект Unicode Python в указатель C на буфер с завершающим NUL, содержащий 16-битные данные Unicode (UTF-16). Как и в случае с
s, не нужно выделять память для буфера данных Unicode; указатель на существующие данные Unicode сохраняется в переменную-указательPy_UNICODE, адрес которой передается.u#(Unicode) [Py_UNICODE *, int]Этот вариант
uсохраняет значения в две переменные C: первая – указатель на буфер данных Unicode, вторая – его длина. Не-Unicode объекты обрабатываются путем интерпретации их указателя read-buffer как указателя на массивPy_UNICODE.es(строка, Unicode или объект, совместимый с буфером символов) [const char *encoding, char **buffer]Этот вариант
sиспользуется для кодирования Unicode и объектов, преобразуемых в Unicode, в буфер символов. Он работает только для закодированных данных без встроенных NUL-байтов.Этот формат требует два аргумента. Первый используется только как входной и должен быть
const char*, который указывает на имя кодировки в виде строки с завершающим NUL, или NULL, в этом случае используется кодировка по умолчанию. Исключение возбуждается, если указанная кодировка неизвестна Python. Второй аргумент должен бытьchar**; значение указателя, на который он ссылается, будет установлено на буфер с содержимым текста аргумента. Текст будет закодирован в кодировке, указанной первым аргументом.PyArg_ParseTuple()выделит буфер необходимого размера, скопирует закодированные данные в этот буфер и настроит *buffer так, чтобы он ссылался на вновь выделенную память. Вызывающая сторона обязана вызватьPyMem_Free()для освобождения выделенного буфера после использования.et(строка, Unicode или объект, совместимый с буфером символов) [const char *encoding, char **buffer]То же, что и
es, за исключением того, что 8-битные строковые объекты передаются без перекодирования. Вместо этого реализация предполагает, что строковый объект использует кодировку, переданную в качестве параметра.es#(строка, Unicode или объект, совместимый с буфером символов) [const char *encoding, char **buffer, int *buffer_length]Этот вариант
s#используется для кодирования Unicode и объектов, преобразуемых в Unicode, в буфер символов. В отличие от форматаes, этот вариант допускает входные данные, содержащие символы NUL.Требует три аргумента. Первый используется только как входной и должен быть
const char*, который указывает на имя кодировки в виде строки с завершающим NUL, или NULL, в этом случае используется кодировка по умолчанию. Исключение возбуждается, если указанная кодировка неизвестна Python. Второй аргумент должен бытьchar**; значение указателя, на который он ссылается, будет установлено на буфер с содержимым текста аргумента. Текст будет закодирован в кодировке, указанной первым аргументом. Третий аргумент должен быть указателем на целое число; соответствующее целое число будет установлено в количество байт в выходном буфере.Существует два режима работы:
Если *buffer указывает на указатель NULL, функция выделит буфер необходимого размера, скопирует закодированные данные в этот буфер и установит *buffer так, чтобы он ссылался на вновь выделенную память. Вызывающая сторона обязана вызвать
PyMem_Free()для освобождения выделенного буфера после использования.Если *buffer указывает на не-NULL указатель (уже выделенный буфер),
PyArg_ParseTuple()будет использовать это место как буфер и интерпретировать начальное значение *buffer_length как размер буфера. Затем он скопирует закодированные данные в буфер и добавит завершающий NUL. Если буфер недостаточно велик, будет установленTypeError. Примечание: начиная с Python 3.6 будет установленValueError.В обоих случаях *buffer_length устанавливается в длину закодированных данных без завершающего NUL-байта.
et#(строка, Unicode или объект, совместимый с буфером символов) [const char *encoding, char **buffer, int *buffer_length]Аналогично
es#за исключением того, что строковые объекты передаются без перекодировки. Вместо этого реализация предполагает, что строковый объект использует кодировку, переданную в качестве параметра.b(целое) [unsigned char]Преобразует неотрицательное целое число Python в беззнаковое крошечное целое, хранящееся в C
unsigned char.B(целое) [unsigned char]Преобразует целое число Python в tiny int без проверки переполнения, сохраняет в C
unsigned char.Новое в версии 2.3.
h(целое) [short int]Преобразует целое число Python в C
short int.H(целое) [unsigned short int]Преобразует целое число Python в C
unsigned short intбез проверки переполнения.Новое в версии 2.3.
i(целое) [int]Преобразует целое число Python в обычное C
int.I(целое) [unsigned int]Преобразует целое число Python в C
unsigned intбез проверки переполнения.Новое в версии 2.3.
l(целое) [long int]Преобразует целое число Python в C
long int.k(целое) [unsigned long]Преобразует целое число Python (int или long) в C
unsigned longбез проверки переполнения.Новое в версии 2.3.
L(целое) [PY_LONG_LONG]Преобразует целое число Python в C
long long. Этот формат доступен только на платформах, поддерживающихlong long(или_int64в Windows).K(целое) [unsigned PY_LONG_LONG]Преобразует целое число Python (int или long) в C
unsigned long longбез проверки переполнения. Этот формат доступен только на платформах, поддерживающихunsigned long long(илиunsigned _int64в Windows).Новое в версии 2.3.
n(целое) [Py_ssize_t]Преобразует целое число Python (int или long) в C
Py_ssize_t.Новое в версии 2.5.
c(строка длиной 1) [char]Преобразует символ Python, представленный как строка длиной 1, в C
char.f(число с плавающей запятой) [float]Преобразует число с плавающей точкой Python в C-тип
float.d(число с плавающей запятой) [double]Преобразует число с плавающей точкой Python в C-тип
double.D(комплексное) [Py_complex]Преобразует комплексное число Python в структуру C
Py_complex.O(объект) [PyObject *]Сохраняет объект Python (без какого-либо преобразования) в указателе на объект C. Таким образом, программа на C получает фактический переданный объект. Счётчик ссылок объекта не увеличивается. Сохранённый указатель не является NULL.
O!(объект) [typeobject, PyObject *]Сохраняет объект Python в указателе на объект C. Это похоже на
O, но принимает два аргумента C: первый – адрес объекта типа Python, второй – адрес переменной C (типаPyObject*), в которую сохраняется указатель на объект. Если объект Python не имеет требуемого типа, возбуждаетсяTypeError.O&(object) [конвертер, что угодно]Преобразует объект Python в переменную C с помощью функции converter. Эта функция принимает два аргумента: первый – функция, второй – адрес переменной C (произвольного типа), преобразованный в
void *. Функция converter, в свою очередь, вызывается следующим образом:status = converter(object, address);
где object – это преобразуемый объект Python, а address – это аргумент
void*, переданный функцииPyArg_Parse*()функции. Возвращаемый status должен быть1для успешного преобразования и0, если преобразование не удалось. Когда преобразование не удалось, функция converter должна возбудить исключение и оставить содержимое address без изменений.S(строка) [PyStringObject *]Аналогично
O, но требует, чтобы объект Python был строковым объектом. ВозбуждаетTypeError, если объект не является строковым. Переменная C может также объявляться какPyObject*.U(строка Unicode) [PyUnicodeObject *]Аналогично
O, но требует, чтобы объект Python был объектом Unicode. ВозбуждаетTypeError, если объект не является объектом Unicode. Переменная C может также объявляться какPyObject*.t#(буфер символов только для чтения) [char *, int]Аналогично
s#, но принимает любой объект, реализующий интерфейс буфера только для чтения. Переменнаяchar*устанавливается указывающей на первый байт буфера, аintустанавливается в длину буфера. Принимаются только односегментные буферные объекты; для всех остальных возбуждаетсяTypeError.w(буфер символов для чтения и записи) [char *]Аналогично
s, но принимает любой объект, реализующий интерфейс буфера для чтения и записи. Вызывающий должен определить длину буфера другими средствами или использоватьw#вместо этого. Принимаются только односегментные буферные объекты; для всех остальных возбуждаетсяTypeError.w#(буфер символов для чтения и записи) [char *, Py_ssize_t]Аналогично
s#, но принимает любой объект, реализующий интерфейс буфера для чтения и записи. Переменнаяchar *устанавливается указывающей на первый байт буфера, аPy_ssize_tустанавливается в длину буфера. Принимаются только односегментные буферные объекты;TypeErrorвозбуждается для всех остальных.w*(байт-ориентированный буфер для чтения и записи) [Py_buffer]Это относится к
wтак же, какs*относится кs.Новое в версии 2.6.
(items)(кортеж) [соответствующие элементы]Объект должен быть последовательностью Python, длина которой равна количеству форматных единиц в items. Аргументы C должны соответствовать отдельным форматным единицам в items. Форматные единицы для последовательностей могут быть вложенными.
Примечание
До версии Python 1.5.2 этот спецификатор формата принимал только кортеж, содержащий отдельные параметры, а не произвольную последовательность. Код, который ранее вызывал возбуждение
TypeError, теперь может выполняться без исключения. Ожидается, что это не станет проблемой для существующего кода.
Можно передавать длинные целые Python там, где требуются целые; однако должная проверка диапазона не выполняется – старшие биты бесшумно отбрасываются, если принимающее поле слишком мало для значения (на самом деле семантика унаследована от понижающих приведений в C – результат может отличаться).
Некоторые другие символы имеют значение в строке формата. Они не могут встречаться внутри вложенных скобок. Вот они:
|Указывает, что остальные аргументы в списке аргументов Python являются необязательными. Переменные C, соответствующие необязательным аргументам, должны быть инициализированы значением по умолчанию – если необязательный аргумент не указан,
PyArg_ParseTuple()не изменяет содержимое соответствующей переменной (переменных) C.:Список форматных единиц заканчивается здесь; строка после двоеточия используется как имя функции в сообщениях об ошибках («связанное значение» исключения, которое возбуждает
PyArg_ParseTuple()).;Список форматных единиц заканчивается здесь; строка после точки с запятой используется как сообщение об ошибке вместо сообщения об ошибке по умолчанию.
:и;взаимно исключают друг друга.
Обратите внимание, что любые ссылки на объекты Python, передаваемые вызывающему, являются заимствованными ссылками; уменьшать их счётчик ссылок не следует.
Дополнительные аргументы, передаваемые этим функциям, должны быть адресами переменных, тип которых определяется строкой формата; они используются для хранения значений из входного кортежа. Существует несколько случаев, как описано в списке форматных единиц выше, когда эти параметры используются как входные значения; они должны соответствовать тому, что указано для соответствующей форматной единицы в этом случае.
Для успешного преобразования объект arg должен соответствовать формату, а
формат должен быть полностью использован. В случае успеха функции PyArg_Parse*()
возвращают true, в противном случае они возвращают false и возбуждают соответствующее исключение.
Если функции PyArg_Parse*() завершаются ошибкой из-за сбоя преобразования в
одной из форматных единиц, переменные по адресам, соответствующим этой
и следующим форматным единицам, остаются нетронутыми.
-
int
PyArg_ParseTuple(PyObject *args, const char *format, ...)¶ Разбирает параметры функции, принимающей только позиционные параметры, в локальные переменные. В случае успеха возвращает true; в случае неудачи возвращает false и возбуждает соответствующее исключение.
-
int
PyArg_VaParse(PyObject *args, const char *format, va_list vargs)¶ Идентична
PyArg_ParseTuple(), за исключением того, что принимает va_list вместо переменного числа аргументов.
-
int
PyArg_ParseTupleAndKeywords(PyObject *args, PyObject *kw, const char *format, char *keywords[], ...)¶ Разбирает параметры функции, которая принимает как позиционные, так и именованные параметры, в локальные переменные. Возвращает true в случае успеха; в случае неудачи возвращает false и возбуждает соответствующее исключение.
-
int
PyArg_VaParseTupleAndKeywords(PyObject *args, PyObject *kw, const char *format, char *keywords[], va_list vargs)¶ Идентична
PyArg_ParseTupleAndKeywords(), но принимает va_list вместо переменного числа аргументов.
-
int
PyArg_Parse(PyObject *args, const char *format, ...)¶ Функция, используемая для разбора списков аргументов «устаревших» функций – это функции, которые используют метод разбора параметров
METH_OLDARGS. Не рекомендуется использовать её для разбора параметров в новом коде, и большая часть кода в стандартном интерпретаторе была изменена, чтобы больше не использовать её для этой цели. Однако она остаётся удобным способом разложения других кортежей и может продолжать использоваться для этой цели.
-
int
PyArg_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, ...)¶ Более простая форма извлечения параметров, которая не использует строку формата для указания типов аргументов. Функции, использующие этот метод для извлечения своих параметров, должны быть объявлены как
METH_VARARGSв таблицах функций или методов. Кортеж, содержащий фактические параметры, должен передаваться как args; он должен быть именно кортежем. Длина кортежа должна быть не менее min и не более max; min и max могут быть равны. В функцию должны передаваться дополнительные аргументы, каждый из которых должен быть указателем на переменнуюPyObject*; они будут заполнены значениями из args; они будут содержать заимствованные ссылки. Переменные, соответствующие необязательным параметрам, не указанным в args, не будут заполнены; они должны быть инициализированы вызывающим. Эта функция возвращает true в случае успеха и false, если args не является кортежем или содержит неправильное количество элементов; в случае ошибки будет установлено исключение.Это пример использования данной функции, взятый из исходников вспомогательного модуля
_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)
Новое в версии 2.2.
Изменено в версии 2.5: Эта функция использовала тип
intдля min и max. Это может потребовать изменений в вашем коде для корректной поддержки 64-разрядных систем.
-
PyObject*
Py_BuildValue(const char *format, ...)¶ - Возвращаемое значение: новая ссылка.
Создаёт новое значение на основе строки формата, аналогичной принимаемым семейством функций
PyArg_Parse*(), и последовательности значений. Возвращает значение или NULL в случае ошибки; будет возбуждено исключение, если возвращён NULL.Py_BuildValue()не всегда создаёт кортеж. Он создаёт кортеж, только если его строка формата содержит две или более форматные единицы. Если строка формата пуста, он возвращаетNone; если она содержит ровно одну форматную единицу, он возвращает объект, описываемый этой форматной единицей. Чтобы заставить его вернуть кортеж размера0или один, заключите строку формата в круглые скобки.Когда буферы памяти передаются как параметры для предоставления данных для построения объектов, как в форматах
sиs#, необходимые данные копируются. Буферы, предоставленные вызывающим, никогда не используются напрямую объектами, созданнымиPy_BuildValue(). Другими словами, если ваш код вызываетmalloc()и передаёт выделенную память вPy_BuildValue(), ваш код отвечает за вызовfree()для этой памяти после того, какPy_BuildValue()вернёт управление.В приведённом ниже описании выделенная кавычками форма – это единица формата; запись в круглых скобках – это тип объекта Python, который вернёт единица формата; а запись в квадратных скобках – это тип передаваемого(ых) значения(й) C.
Символы пробела, табуляции, двоеточия и запятой в строках формата игнорируются (но не внутри единиц формата, таких как
s#). Это можно использовать, чтобы сделать длинные строки формата чуть более читаемыми.s(строка) [char *]Преобразует C-строку, завершающуюся нулём, в объект Python. Если указатель на C-строку равен NULL, используется
None.s#(строка) [char *, int]Преобразует C-строку и её длину в объект Python. Если указатель на C-строку равен NULL, длина игнорируется и возвращается
None.z(строка илиNone) [char *]То же, что и
s.z#(строка илиNone) [char *, int]То же, что и
s#.u(строка Unicode) [Py_UNICODE *]Преобразует буфер данных Unicode (UCS‑2 или UCS‑4), завершающийся нулём, в объект Python Unicode. Если указатель на буфер Unicode равен NULL, возвращается
None.u#(строка Unicode) [Py_UNICODE *, int]Преобразует буфер данных Unicode (UCS‑2 или UCS‑4) и его длину в объект Python Unicode. Если указатель на буфер Unicode равен NULL, длина игнорируется и возвращается
None.i(целое) [int]Преобразует простой C-тип
intв объект целого числа Python.b(целое) [char]Преобразует простой C-тип
charв объект целого числа Python.h(целое) [short int]Преобразует простой C-тип
short intв объект целого числа Python.l(целое) [long int]Преобразует C
long intв объект Python int.B(целое) [unsigned char]Преобразует C
unsigned charв объект Python int.H(целое) [unsigned short int]Преобразует C
unsigned short intв объект Python int.I(целое/long) [unsigned int]Преобразует значение C
unsigned intв объект Python integer или Python long integer, если оно большеsys.maxint.k(целое/long) [unsigned long]Преобразует значение C
unsigned longв объект Python integer или Python long integer, если оно большеsys.maxint.L(long) [PY_LONG_LONG]Преобразует значение C
long longв объект Python long integer. Доступно только на платформах, поддерживающихlong long.K(long) [unsigned PY_LONG_LONG]Преобразует значение C
unsigned long longв объект Python long integer. Доступно только на платформах, поддерживающихunsigned long long.n(int) [Py_ssize_t]Преобразует значение C
Py_ssize_tв Python integer или long integer.Новое в версии 2.5.
c(строка длины 1) [char]Преобразует значение C
int, представляющее символ, в строку Python длины 1.d(float) [double]Преобразует C
doubleв Python-число с плавающей запятой.f(float) [float]То же, что и
d.D(complex) [Py_complex *]Преобразует структуру C
Py_complexв комплексное число Python.O(объект) [PyObject *]Передаёт объект Python без изменений (за исключением его счётчика ссылок, который увеличивается на единицу). Если переданный объект является указателем NULL, считается, что это произошло из-за того, что вызов, формирующий аргумент, обнаружил ошибку и установил исключение. Следовательно,
Py_BuildValue()вернёт NULL, но не вызовет исключение. Если исключение ещё не было вызвано, устанавливаетсяSystemError.S(объект) [PyObject *]То же, что и
O.N(объект) [PyObject *]То же, что и
O, за исключением того, что не увеличивает счётчик ссылок на объект. Полезно, когда объект создаётся вызовом конструктора объекта в списке аргументов.O&(object) [конвертер, что угодно]Преобразует произвольное значение в объект Python с помощью функции преобразователя. Функция вызывается с произвольным значением (которое должно быть совместимо с
void *) в качестве аргумента и должна вернуть «новый» объект Python или NULL в случае ошибки.(items)(tuple) [соответствующие элементы]Преобразует последовательность значений C в кортеж Python с тем же количеством элементов.
[items](list) [соответствующие элементы]Преобразует последовательность значений C в список Python с тем же количеством элементов.
{items}(dictionary) [соответствующие элементы]Преобразует последовательность значений C в словарь Python. Каждая пара последовательных значений C добавляет один элемент в словарь, выступая в качестве ключа и значения соответственно.
Если в строке формата есть ошибка, устанавливается исключение
SystemErrorи возвращается NULL.
-
PyObject*
Py_VaBuildValue(const char *format, va_list vargs)¶ Идентична
Py_BuildValue(), за исключением того, что принимает va_list вместо переменного числа аргументов.