ctypes:古龙字神奇地变长了

2024-10-03 02:47:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python2.7为我的类编写deepcopy函数。我遇到了一个奇怪的问题 我的代码如下

import copy
from ctypes import *
class Graph (Structure):
    _fields_ = [("numVertices", c_ulong),
                    ("numEdges", c_ulong)]
    def __init__(self):
        self.numVertices = c_ulong(0)
        self.numEdges = c_ulong(0)

    def __deepcopy__(self,memo={}):
        newInstance = Graph()
        newInstance.numVertices = c_ulong(self.numVertices.value)
        newInstance.numEdges = c_ulong(self.numEdges.value)
        return newInstance

graph = Graph()
anotherGraph = copy.deepcopy(graph)

我得到以下错误:

^{pr2}$

如果您尝试:

type(graph.numVertices)

结果是漫长的

我把这些数字声明为c峎ulong()。为什么会变长?在


Tags: 函数代码fromimportselfvaluedefgraph
1条回答
网友
1楼 · 发布于 2024-10-03 02:47:10

结构中的字段类型仍保持不变,但ctypes在读取值时有一些“有用”的转换:

from ctypes import *

class Test(Structure):
    _fields_ = [('a',c_ulong),
                ('b',c_char_p)]

t = Test(1,b'hello')
print(type(t.a),type(t.b))
print(t._fields_)

输出:

^{pr2}$

因此,您可以按以下方式编写代码,它将正常工作:

import copy
from ctypes import *
class Graph (Structure):
    _fields_ = [("numVertices", c_ulong),
                    ("numEdges", c_ulong)]
    def __init__(self):
        self.numVertices = 0
        self.numEdges = 0

    def __deepcopy__(self,memo={}):
        newInstance = Graph()
        newInstance.numVertices = self.numVertices
        newInstance.numEdges = self.numEdges
        return newInstance

graph = Graph()
anotherGraph = copy.deepcopy(graph)

您可以通过从类派生来抑制转换,但这通常是不必要的。一个用例是使用ctypes调用返回已分配字符串的函数。您需要禁止c_char_p到Python字节字符串的转换,以便以后可以释放c_char_p

from ctypes import *

class ulong(c_ulong): pass
class char_p(c_char_p): pass

class Test(Structure):
    _fields_ = [('a',ulong),
                ('b',char_p)]

t = Test(1,b'hello')
print(type(t.a),type(t.b))
print(t.a,t.b)

输出:

<class '__main__.ulong'> <class '__main__.char_p'>
<ulong object at 0x0000000006263748> char_p(b'hello')

相关问题 更多 >