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

Why does hasattr raise a ValueError although attribute exists?

我运行遇到了一些奇怪的事情。请参阅以下示例:

>>> 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 也会 returns True,但它会引发 ValueError。这是为什么?

hasattr 通过调用 getattr 并查看是否引发 AttributeErrorimplemented

由于访问 ctypes 指针的 contents 属性试图解除对指针的引用,您看到的就是您所看到的。