为什么 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
并查看是否引发 AttributeError
是 implemented。
由于访问 ctypes
指针的 contents
属性试图解除对指针的引用,您看到的就是您所看到的。
我运行遇到了一些奇怪的事情。请参阅以下示例:
>>> 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
并查看是否引发 AttributeError
是 implemented。
由于访问 ctypes
指针的 contents
属性试图解除对指针的引用,您看到的就是您所看到的。