如何导入方法包装器类型?

How to import method-wrapper type?

我有一个递归包装对象的库 module-wrapper。我想确定一个对象是否具有类函数类型。我可以使用以下方法检查几乎所有类似函数的对象:

inspect.isbuiltin(object=obj) or
inspect.isfunction(object=obj) or
inspect.ismethod(object=obj) or
inspect.ismethoddescriptor(object=obj)

问题是一些绑定的方法没有被这段代码检测到,例如:

s = "Hello, world!"
type(s.__add__)
# method-wrapper

我想我无法使用 inspect 模块检查对象是否为 method-wrapper。但是我该如何导入这种类型呢?我没找到。

现在我的代码中有一个丑陋的 hack:

MethodWrapper = type(''.__add__)
isinstance(obj, MethodWrapper)

UPD0:

我不想使用 callable,因为它检测到 类 和实现 __call__ 的对象,但我希望处理那些 类 和对象分开。

types 模块为许多“实现”类型提供名称,包括几个用 C 实现的函数。type("".__str__)MethodWrapperType 的具体示例刚刚添加到 CPython 中3.7.

因为这个区域比较隐蔽,种类较多,所以callable可能真的是最好的选择。您可以轻松地首先检查 type 个对象以“排除”类,以及各种启发式方法( 例如 try 调用 vars 在对象上或检查 type(x).__module__) 可用于识别典型的“可调用对象”(并不是说它们与内置函数类型根本不同)。