首页 > 解决方案 > 如何导入方法包装类型?

问题描述

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

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

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

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

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

UPD0:

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

标签: pythonmethodstypesinspect

解决方案


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

因为这个区域很微妙,种类也很多,callable可能真的是最好的选择。您可以轻松地首先检查type对象以“排除”类,并且可以使用各种启发式方法(例如try调用vars对象或检查type(x).__module__)来识别典型的“可调用对象”(并不是那些与内置的根本不同)函数类型)。


推荐阅读