使用Python C-API来确定对象是否有效?

时间:2015-02-17 22:17:19

标签: python c validation

总结:Python C-API中是否有某种方法可以确定PyObject *是否指向有效的Python对象?

背景信息:我在IDL(交互式数据语言)和Python之间用C代码编写桥梁。当一个Python对象被包装在一个IDL对象中时,我要做的第一件事是使用以下C代码增加Python引用计数:

PyObject *pyObj = (PyObject *) id;
Py_INCREF(pyObj);

问题:通常,整数" id"传递给我的包装函数的是由我的桥代码创建的,所以我可以相信它是一个有效的Python标识符(即它指向一个真正的" Python对象)。但是,如果用户尝试手动创建其中一个对象并只传入Python id的随机整数,那么Python会在Py_INCREF上出现故障并导致应用程序崩溃。

我想进行健全性检查,只是为了验证指针是否确实指向了有效的Python对象。我在Python C API中找不到任何实际检查给定指针是否确实是有效Python对象的东西。我试着打电话给内置的" id"方法,以及垃圾收集器" gc.is_tracked()"但如果给出一个糟糕的指针,它们也会崩溃。

Python C-API中是否有任何内容可以验证PyObject指针是否有效?

1 个答案:

答案 0 :(得分:0)

看起来答案是" no",没有办法使用Python C API来确定PyObject指针是否有效。使用C指针的通常规则适用 - 小心,并知道你正在做什么!