【发布时间】:2017-10-20 18:30:19
【问题描述】:
我已经用 cython 封装了 c++ 代码,以便在 python 中使用。
演示示例
Foopxd.pxd
cdef extern from "Foos.hpp":
cdef cppclass Foos
Foopyx.pyx
cdef class Pyfoos:
cdef Foos thisobj
def get_foos(pattern):
cdef Foos foox
foox = Foopxd.get_foos(pattern)
fooy = Pyfoos()
fooy.thisobj = foox
return fooy
函数get_foo 在 cpp 或 python 中返回一个类对象。返回的对象是Foos 类型,它是Foo 类型对象的集合。我可以将返回值存储在Pyfoos() 类型的变量A 中。但是,我无法从 python 中的对象foos 中遍历单个foo。但是我可以访问
A = get_foos("*")
A[5]
或
for(auto x:A){print x;}
来自 C++
我想在 python 中添加所需的内容以使类可迭代或可下标。
注意:我知道get_foos() 返回一个Foos() 类型的对象,这是Foo 的集合,但不知道我是否在这里准确地表示了这一点。此外,我无法访问 cpp 函数,但可以保证 get_foos() 将返回正确的对象[这是对象的集合]。但是,我不知道打包对象Foos的结构。
蟒蛇
>> import foo
>> A = Pyfoos()
>> A = get_foos("*")
>> A[2]
TypeError: "Foos" object is not subscriptable
>> for x in A:
... print(x)
...
TypeError: "Foos" object is not iterable
鉴于我无法控制 cpp/hpp 文件。但我从他们那里得到了对象。我该怎么做才能使它们在 for 循环中可迭代或可直接下标?
我收到了这个错误
TypeError: 'Foopxd.Pyfoos' object is not iterable
我想为foos 中的每个foo 调用x.bar 属性。
【问题讨论】:
-
这显然不是minimal reproducible example。当您的代码不包含名为
Foo的类型时,为什么会得到TypeError: "Foo" object is not subscriptable? -
好的。但仍然存在基本问题:您有一个名为
Foopxd.get_foos的函数,我们对此一无所知,但它似乎按值返回Foos。我们对Foos几乎一无所知,除了它可能是一个不同类的容器(foo?),而且我们应该知道如何迭代这个神秘的容器。最重要的是,您的编辑仍然没有显示您的 Python 代码会产生的错误。这是无法回答的。