尽管属性存在,为什么hasattr会引发ValueError?

时间:2018-03-31 15:16:23

标签: python python-3.x ctypes

我碰到了奇怪的事情。请参阅以下示例:

>>> 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。那是为什么?

1 个答案:

答案 0 :(得分:2)

hasattr implemented致电getattr并查看是否已提出AttributeError

由于访问contents指针的ctypes属性会尝试取消引用您正在看到的内容的指针。