如何在Python 3.9环境下使用pybind11判断py::object是否为Python decimal.Decimal类型
判断pybind11中py::object是否为decimal.Decimal类型(Python3.9环境)
作为pybind11新手,判断一个py::object是否属于Python的decimal.Decimal类型其实很直观,我会用具体代码和步骤帮你搞定:
核心思路
要实现这个判断,关键是先获取Python中decimal.Decimal的类型对象,再用pybind11提供的py::isinstance函数做类型检查。
具体实现步骤
1. 获取Decimal类型对象
为了效率,建议在模块初始化时一次性导入decimal模块并获取Decimal类型,用静态变量存储避免重复导入开销:
#include <pybind11/pybind11.h> namespace py = pybind11; // 静态存储Decimal类型,模块初始化时赋值一次即可 static py::type decimal_decimal_type;
2. 编写判断函数
利用py::isinstance函数,传入目标py::object和我们获取到的Decimal类型,返回布尔值:
bool is_python_decimal(const py::object& obj) { // 直接用isinstance做类型检查 return py::isinstance(obj, decimal_decimal_type); }
3. 模块初始化时绑定类型
在pybind11模块的初始化函数中,完成decimal模块的导入和类型赋值:
PYBIND11_MODULE(your_module_name, m) { // 导入Python的decimal模块 auto decimal_module = py::module::import("decimal"); // 获取Decimal类型并赋值给静态变量 decimal_decimal_type = decimal_module.attr("Decimal"); // 绑定判断函数到Python模块 m.def("is_decimal", &is_python_decimal, py::arg("obj"), "Check if input object is a decimal.Decimal instance"); }
临时判断的简化写法(适合单次调用场景)
如果只是偶尔需要判断,不想维护静态变量,也可以在函数内部临时导入模块获取类型:
bool is_python_decimal(const py::object& obj) { auto decimal_module = py::module::import("decimal"); auto decimal_type = decimal_module.attr("Decimal"); return py::isinstance(obj, decimal_type); }
测试验证
编译模块后,在Python3.9环境中测试:
import your_module_name from decimal import Decimal print(your_module_name.is_decimal(Decimal("3.1415"))) # 输出: True print(your_module_name.is_decimal(3.1415)) # 输出: False print(your_module_name.is_decimal("3.1415")) # 输出: False print(your_module_name.is_decimal(None)) # 输出: False
注意事项
- Python3.9默认自带
decimal模块,无需额外安装 py::isinstance会自动处理子类实例的判断(如果有Decimal的子类,也会返回True)- 静态变量的方式更适合高频调用场景,能减少模块导入的性能开销
内容的提问来源于stack exchange,提问作者linrongbin
相关产品推荐
相关产品推荐

