以下代码导致引发分段错误。我不知道为什么。。。你知道吗
import numpy as np
from intbitset import intbitset
arr = np.array([1,2,3,4,5])
# This works
intbitset(arr.tolist())
=> intbitset([1, 2, 3, 4, 5])
# This throws SIGSEGV
intbitset([x for x in arr])
[x for x in arr]
工作正常,并按预期返回列表。你知道吗
有人对此有什么解释吗?在输入intbitset
ctr之前,列表理解不是被计算成一个列表吗?你知道吗
我已经在python3.6.3和2.7.13上进行了测试(需要将zip
更改为itertools.izip
)。两个都撞车了。intbitset
版本是2.3.0
有件有趣的事:
观察对
PyErr_Display
和PyTraceBack_Print
的调用。看起来Python试图显示一个错误,但在这个过程中崩溃了。事实上,这不会崩溃:相反,它输出以下内容:
此异常是here in ^{} 引发的。注意^{} 是一个特殊的Cython函数。你知道吗
它是响应另一个异常而引发的,来自numpyc代码中的^{} 。它可以通过索引标量触发,如下所示:
intbitset
触发此异常的原因是this line:事实上,numpy标量(
numpy.int64
在本例中)确实有一个__getitem__
,它们只是不喜欢你调用它。这会导致intbitset
错误地假设它正在接收一个sequence made of tuples,从而触发对引发__getitem__
的异常的调用。你知道吗这就解释了为什么传递一个生成器
intbitset(x for x in arr)
时它不会崩溃:它没有__getitem__
,所以intbitset会进入一个不同的代码路径。如果直接传递intbitset(arr)
,tuple_of_tuples
行在尝试将arr
转换为bool
时会触发另一个异常:这个异常与numpy相当不搭调(与列表转换为
bool
的方式不一致),但这就是它的工作方式。你知道吗那么为什么
invalid index to scalar
异常会导致segfault,即使truth value of an array
不会?事实上,如果我在它后面加上raise ValueError()
,两个都会崩溃,所以在这两种情况下显然都是未定义的行为,而且纯粹是运气,它有时不会崩溃。你知道吗我的猜测是
intbitset
通过从__cinit__
引发异常,做了一些意想不到的事情。在Cython文档中没有明确禁止,所以我不知道怎么做或者做什么。你知道吗相关问题 更多 >
编程相关推荐