gpt4 book ai didi

python - 打印 CPython 对象的底层 C 结构表示

转载 作者:行者123 更新时间:2023-11-30 16:39:24 25 4
gpt4 key购买 nike

在底层,任何 Python 对象都被实现为带有一些字段的 C 结构体。 A 16字节header包含引用计数和指向对象类型的指针始终存在于该结构中。至少 64 位 CPython 3.x 是这样,我的问题受到限制。

出于学术目的和乐趣,我正在寻找一个函数print_object(obj),它可以打印出传递的对象的底层struct >obj.

就实现而言,最简单的Python对象可能是float,它只是附加到前面提到的 header 的C double。在这个简单的例子中,我已经能够使用 ctypesstruct 模块编写自己的此类函数:

import collections, ctypes, struct, sys

header_fields = ['refcount', 'typeptr']
Float = collections.namedtuple('Float', header_fields + ['value'])

def print_object(obj):
ptr = id(obj)
size = sys.getsizeof(obj)
byterep = ctypes.string_at(ptr, size)
header = struct.unpack('qq', byterep[:16])
if isinstance(obj, float):
obj_struct = Float(*header, *struct.unpack('d', byterep[16:]))
elif isinstance(obj, int):
...
print(obj_struct)

# Try it out
a = 1.23
print_object(a)
print('The typeptr should be equal to', id(float))
print('\nNow the refcount should have increased by 1:')
b = a
print_object(a)

本质上,该函数读取对象的底层内存,并将 C struct 的副本构建为 Python namedtuple,有效地重新表示一段 Python在自身。该代码应在 Python 3.5 及更高版本上运行。它打印

Float(refcount=5, typeptr=140429307606720, value=1.23)
The typeptr should be equal to 140429307606720

Now the refcount should have increased by 1:
Float(refcount=6, typeptr=140429307606720, value=1.23)

上面的 print_object 函数非常适合 float,并且相同的方法可以扩展到(我想?)所有其他类型。是否有任何库(或者甚至是 Python 标准库)包含此类功能?

最佳答案

尝试自动执行此操作的问题是没有通用方法来获取 Python 类型的布局。哎呀,甚至没有一个通用的方法来告诉我们这个结构有多大。此外,使用 class 语句创建的类型并不完全使用 struct 作为其实例,尽管它们大多像结构一样工作。

您需要自己为您想要使用的任何类型提供结构定义,并且您仍然需要对 intstr 等类型进行自定义处理特别奇怪的表示。

关于python - 打印 CPython 对象的底层 C 结构表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47063996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com