Принудительное преобразование типов с использованием Python C-API

Мне интересно, можно ли использовать Python C-API для преобразования, например. Float -> String или Bool -> Int или Int -> Bool и т. д.

Не всякое преобразование имеет смысл, например Dict -> List — трудно представить, как это будет выглядеть.

Однако большинство преобразований ДЕЙСТВИТЕЛЬНО имеют смысл.

Float -> Int     would just round to the nearest integer
Float -> Bool    would evaluate True non-zero
Float -> String  would give a string representation (but to what precision?)
Float -> Dict    probably doesn't make sense

Итак, мой вопрос: есть ли способ принудительно преобразовать эти типы с помощью C-API?

Я понимаю, что предпочтительным способом работы Python является внутренняя обработка типа. Итак, вы делаете:

x = 1 + 2.5

И он достаточно умен, чтобы знать, что Long + Float -> Float

Тем не менее, я пишу мост Python/С++, где у меня есть типы Long Float Complex Dict и т.д., и я хочу иметь возможность делать:

// initialise a Float object with an object of unknown type
Float myFloat = somePyObjectPointer; 

Таким образом, инициализация его целым числом будет работать, строка «3.14» будет работать, «foo» не будет работать, Dict не будет работать и т. д.

Я хотел бы использовать механизм Python для того, «что подключается к чему», а не создавать большое количество механизмов C++, чтобы делать это вручную. Обоснование: (1) меньше С++, (2) если CPython изменит функциональность, я не хочу рассинхронизироваться.


person P i    schedule 07.12.2014    source источник


Ответы (1)


Плавающая -> Целое

PyNumber_Int()

Плавающая -> Логическая

Без прямого преобразования, но PyObject_IsTrue() и PyBool_FromLong()

Плавающая -> Строка

PyObject_Repr() или PyObject_Str()

Диктовать -> Список

PyObject_CallMethod(..., "keys"/"values"/"items", NULL)

x = 1 + 2.5

PyNumber_Add()

Плавающая -> Диктовка

Да... нет.

Все, о чем вы могли бы заботиться, это там... где-то.

person Ignacio Vazquez-Abrams    schedule 07.12.2014