namedtuple
реализован исключительно на Python. Вы можете увидеть его полный источник в collection.py. Это очень коротко. Следует иметь в виду, что сама namedtuple
- это функция, которая создает класс в кадре, в котором он вызывается, а затем возвращает этот класс (а не экземпляр этого класса). И именно этот возвращаемый класс используется для создания экземпляров. Таким образом, объект, который вы получаете, - это не то, что вы хотите передать на C++, если хотите передать отдельные экземпляры.
C++ создает struct
определения во время компиляции. namedtuple
создает классы namedtuple во время выполнения. Если вы хотите связать их с C++-структурами, используйте PyObject для создания экземпляров недавно измененного класса внутри C++ и назначьте их во время компиляции struct
. Или создайте экземпляры нового чеканного класса в Python и передайте их на C++.
Или вы можете использовать метод _asdict
(предоставляемый методом фабрики namedtuple для всех классов, которые он создает) и передать это на C++, чтобы затем привязать данные, определенные во время выполнения, к данным, заданным во время компиляции.
Если вы действительно хотите выполнить основную часть работы на C++, вы можете также использовать модуль Struct вместо использования namedtuple.
namedtuple - действительно швейцарский армейский нож Python для данных, который остается на Python. Он предоставляет позиционный доступ, именованный доступ, и все элементы также являются «свойствами» (поэтому у них есть метод доступа, который может использоваться в картах, фильтрах и т. Д. Вместо того, чтобы писать собственные lambdas).
Это место для таких вещей, как привязка БД (когда вы не знаете, какие столбцы будут там во время выполнения). Это менее clunky, чем OrderedDict для преобразования данных из одного формата в другой. Когда он используется таким образом, накладные расходы на обработку строк ничем не отличаются от фактического доступа к db (даже встроенного). Но я бы не использовал namedtuple для больших массивов структур, которые предназначены для использования в вычислениях.
Возможно, у вас возникли проблемы с преобразованием namedtuple, поскольку он не является встроенным. Попробуйте преобразовать namedtuple в кортеж сначала (с уровня python), затем используйте 'PyArg_ParseTuple' в вашем расширении C++. – thorhunter
@thorhunter Я это сделаю. Я немного смутился, читая документацию PyArg_ParseTuple о том, как получить доступ к каждой части. Должен ли я точно знать, сколько байтов Python используется для хранения значений? – Wired365
Нет, вам нужно знать только ту структуру кортежа, которую вы передаете, например. (int, int, string). Затем вы можете привязать их к типам C с помощью 'PyArg_ParseTuple (args," iis ", & int1, & int2, &str);' для 'int int1; int int2; char * str'. Это, конечно, основной пример, вы можете сделайте гораздо больше, используя 'PyArg_ParseTuple' и другие элементы API Python. Вы сможете извлечь любую информацию из PyObject, которая вам нужна (включая длину строки) с использованием Python API так или иначе. Я нашел эту ссылку довольно простой: https: //docs.python.org/2.0/ext/parseTuple.html – thorhunter