使用 Python C-API 强制类型转换
Posted
技术标签:
【中文标题】使用 Python C-API 强制类型转换【英文标题】:Force type conversions using Python C-API 【发布时间】:2014-12-07 08:38:38 【问题描述】:我想知道是否可以使用 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/C++ 桥,其中有 Long Float Complex Dict 等类型,我希望能够做到:
// initialise a Float object with an object of unknown type
Float myFloat = somePyObjectPointer;
所以用整数初始化它会起作用,字符串“3.14”会起作用,“foo”不会起作用,Dict 不会,等等。
我想将 Python 的机器用于“什么插入什么”,而不是构建大量的 C++ 机器来手动完成。基本原理是 (1) 减少 C++,(2) 如果 CPython 更改了我不想不同步的功能。
【问题讨论】:
【参考方案1】:浮点数 -> 整数
PyNumber_Int()
浮点数 -> 布尔值
没有直接转换,但是PyObject_IsTrue()
和PyBool_FromLong()
浮点数 -> 字符串
PyObject_Repr()
或 PyObject_Str()
字典 -> 列表
PyObject_CallMethod(..., "keys"/"values"/"items", NULL)
x = 1 + 2.5
PyNumber_Add()
浮点数 -> 字典
是的……不。
任何你关心的东西,它都在里面……某处。
【讨论】:
以上是关于使用 Python C-API 强制类型转换的主要内容,如果未能解决你的问题,请参考以下文章