>>> class demo(ctypes.Structure):
... _fields_ = [('data', ctypes.POINTER(ctypes.c_int16))]
>>> b = demo()
>>> b.data
<__main__.LP_c_short object at 0x7f709c0550d0>
>>> hasattr(b.data, 'contents')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: NULL pointer access
NULL pointer access
>>> 'contents' in dir(b.data)
True
我想上述行为是有意的,虽然我不完全理解它。 data
是ctypes结构中的一个字段,定义为指向整数的指针。它是未初始化的,即NULL指针。它确实有一个contents
属性,就像人们期望的那样(dir
列出它),尽管访问它是没有意义的。我希望hasattr
也返回True
,但它会引发ValueError
。那是为什么?
答案 0 :(得分:2)
hasattr
implemented致电getattr
并查看是否已提出AttributeError
。
由于访问contents
指针的ctypes
属性会尝试取消引用您正在看到的内容的指针。