使用 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 强制类型转换的主要内容,如果未能解决你的问题,请参考以下文章

java中的强制类型转换

Python 强制类型转换

java中强制类型转换

Java中引用类型的强制类型转换问题

Python帮助强制类型转换

python中字符类型是不是可以强制转化为bool类型