null - 如何在 cython 中检查 Null 中的内存视图是否存在
问题描述
我想检查内存视图是否用无初始化。我有这样的功能:
cdef void test(int[:] a):
if a == NULL:
print("invalid data")
cdef int[:] memview = None
test(memview)
编译时出现此错误:
Invalid types for '==' (int[:], void *)
将 None 分配给内存视图是否存在问题?如果不是这种情况,我该怎么做才能检测到 NULL 值?
谢谢!
解决方案
将我的评论变成一个非常好的答案:
您正在分配None
给您的内存视图:
cdef int[:] memview = None
因此,检查它是有意义的None
,而不是检查NULL
:
if a is None:
最终它们是相似的概念,但不同的东西:NULL
是一个不指向任何东西的指针,而是None
一个单例 Python 对象,它指示某些东西是未设置的。区别实际上是 C 级别和 Python 级别之间的区别,这里的内存视图充当“Python 级别”。
还有一个额外的细节可以让你if a is None
在一个nogil
块中做:Python 确保存在一个None
对象(并且它None
在整个程序中仍然是同一个对象)。因此可以翻译a is None
成C代码
((PyObject *) __pyx_v_a.memview) == Py_None
即一个简单的指针比较,不需要 GIL,因为引用计数没有变化。
推荐阅读
- laravel - laravel 查询生成器中的变量始终为空
- nestjs - NestJS - 将正文发送到响应
- python - 如何修复 AttributeError:“JpegImageFile”对象没有属性“load_img”
- rust - 在 trait 默认方法中多次自我借用
- arrays - Google Apps 脚本:创建和填充嵌套 JSON 对象
- amazon-web-services - 交叉编译 aws webrtc 库时出现库链接错误
- javascript - 减少 javascript for 语句中的代码,其中包含一组 div 和输入
- javascript - 在JavaScript中记录mysql结果时“TextRow”来自哪里
- swift - ScrollView 或 List,如何制作特定的可滚动视图 (SwiftUI)
- reactjs - 如何为 2 个不同的子域支持 React js 应用程序