gpt4 book ai didi

Python c api 和 __add__ 调用

转载 作者:行者123 更新时间:2023-11-28 16:54:26 27 4
gpt4 key购买 nike

我正在编写一个绑定(bind)系统,以一种稍微不寻常的方式向 python 公开类和函数。

通常,人们会创建一个 python 类型并提供表示该类型方法的函数列表,然后允许 python 使用其通用的 tp_getattro 函数来选择正确的方法。

由于我不会在这里进入的原因,我不能这样做,并且必须提供我自己的 tp_getattro 函数,它从其他地方选择方法并返回我自己的“绑定(bind)方法”包装器。这工作正常,但意味着类型方法未在其字典中列出(因此 dir(MyType()) 没有显示任何有趣的内容)。

问题是我似乎无法使 __add__ 方法正常工作。请参阅以下示例:

>>> from mymod import Vec3
>>> v=Vec3()
>>> v.__add__
<Bound Method of a mymod Class object at 0xb754e080>
>>> v.__add__(v)
<mymod.Vec3 object at 0xb751d710>
>>> v+v
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'mymod.Vec3' and 'mymod.Vec3'

如你所见,Vec3有一个__add__方法可以调用,但是python的+拒绝使用它。

如何让 python 使用它? + 运算符在 python 中实际上是如何工作的,它使用什么方法来查看是否可以添加两个任意对象?

谢谢。

(附:我知道其他系统,例如 Boost.Python 和 SWIG 会自动执行此操作,我有充分的理由不使用它们,无论它们多么美妙。)

最佳答案

你的类型的 number methods 中有 nb_add 吗?结构(由您的 type object 的字段 tp_as_number 指向)?

关于Python c api 和 __add__ 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2342416/

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