我想对这个类的列表inner
排序。该列表包含名为Edge
的cdef类的对象。Edge类包含一个名为savings
的成员变量。我想按此变量对列表排序。你知道吗
cdef class Alist:
def __init__(self):
self.inner = []
cdef list inner
cdef void append(self, Edge a):
self.inner.append(a)
cdef void pop(self, int a):
self.inner.pop(a)
cdef void insert(self,int pos,Edge a):
self.inner.insert(pos,a)
cdef int index(self,Edge a):
if a in self.inner:
return self.inner.index(a)
return -1
cdef Edge get(self, int i):
return <Edge> self.inner[i]
cdef void sort(self):
self.inner.sort(key = lambda c : c.Savings)
#self.inner.sort()
def __len__(self):
return len(self.inner)
def __richcmp__(Edge self, Edge other,int op):
if op == 0:
if self.inner.savings < other.inner.savings:
return True
return False
为此,我在类中创建了方法sort
,但在执行该方法时,得到以下错误消息:
Exception AttributeError: "'fib.Edge' object has no attribute 'savings'" in 'fib.Alist.sort' ignored
这里出什么问题了
Python-lambda函数无法访问
Edge
的cdef属性。如果您试图从python直接访问cdef类的属性,您将得到一个错误,除非您将readonly
(用于读访问)或public
(用于读写访问)添加到属性定义中。你知道吗以这个边缘类为例:
如果我们编译它(假设它位于文件
sortlist.pyx
)并将其导入Python shell中:如果您访问
readonly
属性saving
,一切都正常,但是Cython only属性foo
抛出您得到的错误。不是属性不在那里,Python就是看不到它。你知道吗工作示例
基本上,修复方法是:将
readonly
添加到Edge类中的savings声明中。上面的Edge类使用以下代码。你知道吗为什么不需要richcmp(现在的位置)
在
Alist
中定义__richcmp__
方法时,可以使用它来比较两个Alist
对象。因此,键入as Edge在这里没有用处。你知道吗您可以为
Edge
定义一个richcmp
方法,这意味着可以用来比较两个Edge
对象的方法。我强烈建议实施所有的比较。因为像现在这样它可能会表现出一些奇怪的行为因为所有不是
op=0
的比较都默认为False,这是<
操作(也可用作cpython.object.Py_LT
)。所以如果你想用这个,就一直用。你知道吗关于丰富比较的更多细节可以在here中找到。你知道吗
相关问题 更多 >
编程相关推荐