说我有一个简单的功能,如:
>>> def something(value):
... return value + 2
所以,使用types.FunctionType
我可以构建它的副本:
>>> new_function = FunctionType(something.__code__, something.__globals__)
事实证明这些功能彼此不同:
>>>new_function == something
False
像这样的情况是可以接受的 - 谁知道对吗?除了这两个对象是相同的字节到字节(下面附带的func something
的内存转储):
[1, 0, 0, 0, 0, 0, 0, 0, 32, 114, 163, 0, 0, 0, 0, 0, 224, 65, 53, 62, 56, 127, 0, 0, 72, 103, 162, 63, 56, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 164, 0, 0, 0, 0, 0, 48, 94, 53, 62, 56, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 248, 156, 63, 56, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 94, 53, 62, 56, 127, 0, 0]
查看PyFunctionObject
的cpython源代码:
https://github.com/python/cpython/blob/master/Include/funcobject.h#L21
我实际上在内存转储中找到了最后一个字段__qualname__
的位置:
>>> [int(value) for value in struct.pack("Q", id(something.__qualname__))]
[48, 94, 53, 62, 56, 127, 0, 0]
正如您所见,__qualname__
字符串的地址实际上是转储中的最后一个内容,正如预期的那样。
问题:这两个对象是相同的,因为PyFunction_Type
没有实现任何自定义的富比较器,它使用默认的struct-to-struct比较:https://github.com/python/cpython/blob/master/Objects/object.c#L671
这两个实例有何不同?
更新: 我的错误,默认比较函数将两个 POINTERS 与结构进行比较,而不是结构。所以事件虽然结构是相同的比较器产生False。