如何在pybind11中检测py::object是否为复数或可调用对象?
如何在pybind11中检测py::object是否为复数或可调用对象?
哎呀,完全懂你那种用了蹩脚hack后心里别扭的感觉!你现在靠共享缓冲区+Python eval来检测类型的方式确实太绕了,pybind11其实提供了更直接、更优雅的方法来搞定复数和可调用对象的检测,根本不用这么折腾。
先说说复数的检测吧,其实你可以直接获取Python内置的complex类型,然后用pybind11自带的py::isinstance来判断:
bool isComplex(py::object src) { // 只需要导入一次complex类型,用static const避免重复开销 static const py::object complex_type = py::module_::import("builtins").attr("complex"); return py::isinstance(src, complex_type); }
这样就完全不需要搞什么共享缓冲区、拼接字符串再eval了,直接通过pybind11的类型检查API就能完成判断,代码简洁还不容易出错。
再来说可调用对象的检测,Python本身有callable()内置函数,我们可以直接在C++里调用它,而不是绕一大圈:
bool isCallable(py::object src) { // 同样只导入一次callable函数 static const py::object callable_func = py::module_::import("builtins").attr("callable"); // 调用函数并把结果转成bool类型 return py::cast<bool>(callable_func(src)); }
这个方法不仅能检测普通函数,还能识别实现了__call__方法的类实例、类对象这些符合Python可调用定义的对象,比你之前的hack要靠谱得多。
其实核心思路就是:pybind11本身就提供了直接访问Python内置类型和函数的能力,没必要自己通过字符串拼接和eval来间接调用,这样既简化了代码,也减少了潜在的bug风险。
内容来源于stack exchange
相关产品推荐
相关产品推荐

