You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:50:39