Разница:
Py_BuildValue("(ii)", a, b)
ожидает, что a
и b
будут простыми значениями C-int.
PyTuple_Pack(2, a, b)
ожидает, что a
и b
будут уже PyObject
s (а не C-ints).
Документация гласит:
Значения кортежа инициализируются последующими аргументами n C, указывающими на объекты Python . PyTuple_Pack(2, a, b)
эквивалентно Py_BuildValue("(OO)", a, b)
.
Чтобы использовать PyTuple_Pack
, вам нужно сначала преобразовать int-значения в Python-Integer.
Проще использовать Py_BuildValue()
. Если заключить в скобки строку формата в Py_BuildValue
, результатом будет кортеж:
Py_BuildValue()
не всегда создает кортеж. Он создает кортеж, только если его строка формата содержит две или более единиц формата. Если строка формата пуста, возвращается None; если он содержит ровно одну единицу формата, он возвращает любой объект, описанный этой единицей формата. Чтобы заставить его возвращать кортеж размером 0 или один, заключите в скобки строку формата .
Это означает, что вам не о чем беспокоиться, если вы создаете кортеж как минимум из двух элементов:
Py_BuildValue("ii", a, b) # returns a tuple
Py_BuildValue("(ii)", a, b) # returns a tuple
Отличается, если есть только один элемент:
Py_BuildValue("i", a) # returns an integer
# parenthesized:
Py_BuildValue("(i)", a) # returns a tuple with an integer
или вообще без элементов:
Py_BuildValue("") # returns None
# parenthesized:
Py_BuildValue("()") # returns an empty tuple.
Так что просто убедитесь, что в строке формата есть круглые скобки, и возвращаемое значение будет кортежем.