gpt4 book ai didi

python - 在 C++ 中的 PyObject 上调用 `+=`

转载 作者:行者123 更新时间:2023-12-01 14:52:12 24 4
gpt4 key购买 nike

我正在用 C++ 编写一个 Python 模块。
在某个时候,我需要添加一个 PyObject任意类型到另一个。换句话说,和 a += b 一样。会在Python中做。但我无法在 API 中找到执行此操作的函数。
我尝试执行以下操作,

PyObject* increment(PyObject* a, PyObject* b) {
const auto tp = Py_TYPE(a);
[&]{
if (const auto nb = tp->tp_as_number)
if (auto iadd = nb->nb_inplace_add)
return iadd;
if (const auto sq = tp->tp_as_sequence)
if (auto iadd = sq->sq_inplace_concat)
return iadd;
throw error(PyExc_TypeError,
"type "s+(tp->tp_name)+" does not provide __iadd__");
}()(a,b);
return a;
}
但发现 Python float , 也不是 int , 也不是 str实现这些方法。
API 中是否有应用通用 += 的函数?如果没有,我怎么写?

最佳答案

At a certain point, I need to add a PyObject of an arbitrary type to another one. In other words, do the same as a += b would do in Python. But I haven't been able to find a function in the API that does that.


您找不到的函数是 PyNumber_InPlaceAdd .
x += y
在 Python 级别相当于
sum = PyNumber_InPlaceAdd(x, y);
Py_DECREF(x);
x = sum;
在C级。 (如果需要,您也可以同时保留 sumx,这对于异常处理很有用。) PyNumber_InPlaceAdd处理 += 的全部调度逻辑,包括 __iadd__ , 双方的 __add__方法(按正确顺序), NotImplemented哨兵和 nb_inplace_add , nb_add , sq_inplace_concat , 和 sq_concat C 级 Hook 。

关于python - 在 C++ 中的 PyObject 上调用 `+=`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62504576/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com