FunctionType:为什么构造函数与原始函数不同?

时间:2017-12-27 10:53:13

标签: python function cpython

说我有一个简单的功能,如:

>>> 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。

0 个答案:

没有答案