Esta función es la contrapartida de PyArg_ParseTuple(). Se declara así:
PyObject *Py_BuildValue(char *format, ...);
Reconoce un conjunto de unidades de formato similares a las reconocidas por PyArg_ParseTuple(), pero los argumentos (que son entradas a la función y no salidas) no deben ser punteros, sino simples valores. Devuelve un objeto Python nuevo, susceptible de ser devuelto por una función C invocada desde Python.
Una diferencia con PyArg_ParseTuple(): mientras ésta exige
que su primer argumento sea una tupla (ya que las listas de argumentos
en Python siempre se representan mediante tuplas internamente),
Py_BuildValue() no siempre construye una tupla. Sólo construye
una tupla si su cadena de formato contiene dos o más unidades. Si la cadena
de formato está vacía, devuelve None
; si contiene exactamente una
unidad de formato, devuelve un objeto del tipo correspondiente a dicho formato.
Para forzar la construcción de una tupla, en los casos de cero o un elementos,
encerrar entre paréntesis la cadena de formato.
Cuando se pasan bloques de memoria como parámetros para proporcionar datos para formar los objetos, como en los formatos "s" y "s#", se copian los datos necesarios. Los objetos creados por Py_BuildValue() nunca hacen referencia a los bloques de memoria del usuario. En otras palabras, si el código de usuario llama a malloc() y pasa la memoria reservada a Py_BuildValue(), es el código del usuario el responsable de llamar a free() para liberar la memoria a la vuelta de Py_BuildValue().
En la siguiente descripción, la forma entrecomillada es la unidad de formato, la entrada entre paréntesis es el tipo de objeto Python que devolverá la unidad de formato y la entrada entre corchetes es el tipo de valor(es) C que hay que pasar.
Los caracteres espacio, tabulador, dos puntos y coma son ignorados en las cadenas de formato (pero no dentro de las unidades de formato como "s#"). Se puede utilizar este efecto para hacer que las cadenas de formato sean un poco más legibles.
None
.
None
, haciendo caso omiso
de la longitud.
None
) [char *]
None
) [char *, int]
None
.
None
, haciendo caso omiso
de la longitud.
Si hay un error en la cadena de formato, se activa la excepción PyExc_SystemError y se devuelve NULL.
Ejemplos (a la izquierda la llamada, a la derecha el valor de Python resultante):
Py_BuildValue("") None Py_BuildValue("i", 123) 123 Py_BuildValue("iii", 123, 456, 789) (123, 456, 789) Py_BuildValue("s", "hola") 'hola' Py_BuildValue("ss", "hola", "mundo") ('hola', 'mundo') Py_BuildValue("s#", "hola", 3) 'hol' Py_BuildValue("()") () Py_BuildValue("(i)", 123) (123,) Py_BuildValue("(ii)", 123, 456) (123, 456) Py_BuildValue("(i,i)", 123, 456) (123, 456) Py_BuildValue("[i,i]", 123, 456) [123, 456] Py_BuildValue("{s:i,s:i}", "abc", 123, "def", 456) {'abc': 123, 'def': 456} Py_BuildValue("((ii)(ii)) (ii)", 1, 2, 3, 4, 5, 6) (((1, 2), (3, 4)), (5, 6))