gpt4 book ai didi

python - 我在哪里可以找到 Python 3 标准库中的实例方法?

转载 作者:行者123 更新时间:2023-11-28 21:07:55 26 4
gpt4 key购买 nike

我正在尝试测试并修复 a bug in pprint++ (编辑:the correct link; original link left for posterity),这是因为 instancemethod 类型不可哈希:

In [16]: import pandas as pd

In [17]: type(pd.tslib.NaT).__repr__
Out[17]: <instancemethod __repr__ at 0x1058d2be8>

In [18]: hash(type(pd.tslib.NaT).__repr__)
...
TypeError: unhashable type: 'instancemethod'

但我在测试这个问题时遇到了麻烦,因为我不知道在 Python 3 标准库中还能在哪里找到 instancemethod,而且我不希望我的测试依赖于在 Pandas 上。

具体来说,似乎“普通”内置类型具有实现方式略有不同的“实例方法”:

In [19]: type(None).__repr__
Out[19]: <slot wrapper '__repr__' of 'NoneType' objects>

In [20]: hash(type(None).__repr__)
Out[20]: -9223372036583849574

那么:我在哪里可以找到 Python 3 标准库中的 instancemethod,以便我可以针对它编写测试?还是那里没有出现的特殊类型?

(注意:这似乎只影响 Python 3,因为 Python 2 中的相同方法是一个未绑定(bind)方法,它是可散列的)

最佳答案

这种类型没有用在 Python 附带的任何东西中,也没有 Python 级别的 API 来创建这种类型的对象。但是,您可以通过直接调用 C API 来实现:

import ctypes

PyInstanceMethod_New = ctypes.pythonapi.PyInstanceMethod_New
PyInstanceMethod_New.argtypes = (ctypes.py_object,)
PyInstanceMethod_New.restype = ctypes.py_object

arbitrary_callable = sum

instance_method = PyInstanceMethod_New(arbitrary_callable)

名称 instancemethod 看起来很像一个绑定(bind)方法对象,但事实证明它完全是另外一回事。根据其 documentation,这是一个奇怪的内部事物, 应该是 C 类型表示其方法的新方式,除了用于创建类型的标准 C 级 API 实际上并未使用它。

根据 conversations在 Python 问题跟踪器上,此功能是 Cython 和 Pyrex 的开发人员要求的。看起来 pandas.tslib.NaT 是在 Cython 中实现的,Cython 实现实际上使用了这种类型,而用于创建类型的标准 C API 却没有。

请注意,在 Python 2 上情况完全不同。在 Python 2 上,这个新类型不存在,instancemethod 是表示用 Python 编写的普通方法的方法对象类型的名称.在 Python 3 中,新类型采用了该名称,用 Python 编写的方法的方法对象类型现在命名为 method

关于python - 我在哪里可以找到 Python 3 标准库中的实例方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40876368/

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