django 一个类型怎么会与它自己不兼容呢?

bnlyeluc  于 2023-05-19  发布在  Go
关注(0)|答案(1)|浏览(99)

在我的django应用程序(Django 1.6.0,Python 2.7.5运行在Red Hat上)中,我的数据库驱动程序看到ctypes的错误:
TypeError:不兼容的类型,LP_c_int示例而不是LP_c_int示例
代码如下所示:

is_null = value is None
    param.value.is_null = pointer(c_int(is_null)) <-- error occurs on this line

我对ctypes不是很熟悉(我继承了这段代码),但从表面上看,这个错误消息没有任何意义。代码已经运行了很多年,但我现在到处都看到这个错误。我做错什么了吗?
这里是一个最小的repro感谢来自Ilja Everilä的评论:

from ctypes import *
from ctypes import _reset_cache

class DataValue(Structure):
    """Must match a_sqlany_data_value."""

    _fields_ = [("buffer",      POINTER(c_char)),
                ("buffer_size", c_size_t),
                ("length",      POINTER(c_size_t)),
                ("type",        c_int),
                ("is_null",     POINTER(c_int))]

d = DataValue()
_reset_cache()
is_null = False
d.is_null = pointer( c_int( is_null ) )
b1payxdu

b1payxdu1#

我遇到了一个类似的问题,在我的例子中,它与预定义空Structure s有关,以避免循环引用。我在做这样的事情:

from ctypes import Structure, POINTER, pointer, c_int

class B(Structure):
    pass

class A(Structure):
    _fields_ = (('b_ref', POINTER(B)),)

class B(Structure):
    _fields_ = (('a_ref', POINTER(A)),)

b = B()
a = A()

a.b_ref = pointer(b)
b.a_ref = pointer(a)

其给出结果:
TypeError:不兼容的类型,LP_B示例而不是LP_B示例
多么无用的信息…🤬
这些注解提示我ctypes缓存的存在,这让我意识到重新定义是问题所在。解决方案是在设置_fields_之前简单地预定义所有类:

from ctypes import Structure, POINTER, pointer, c_int

class A(Structure): pass
class B(Structure): pass

A._fields_ = (('b_ref', POINTER(B)),)
B._fields_ = (('a_ref', POINTER(A)),)

b = B()
a = A()

a.b_ref = pointer(b)
b.a_ref = pointer(a)

然而,关于你对原生c_int的确切问题,我相信这可能与Django的开发服务器重新加载任何更改的模块的能力有关。我从来没有使用过django,但是,这将是我很难测试(特别是考虑到年龄的职位)。ctypes在导入时自动调用_reset_cache()。通常对import ...的重复调用只是获取库的缓存版本,因此我假设它必须与某种类似importlib.reload(...)的调用相关。

相关问题