如何导入方法包装类型?

时间:2018-11-03 10:33:40

标签: python methods types inspect

我有一个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

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

现在我的代码中有一个难看的骇客:

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

UPD0:

我不想使用callable,因为它可以检测实现__call__的类和对象,但是我希望这些类和对象分别处理。

1 个答案:

答案 0 :(得分:1)

types模块提供了许多“实现”类型的名称,包括几种用C实现的函数的名称。type("".__str__)的特定示例MethodWrapperType刚刚在CPython3.7中添加。

由于该区域很细微,类型数量很多,callable可能确实是最佳选择。您可以轻松地先检查type个对象以“排除”类,然后使用各种启发式方法( eg try调用对象上的vars或检查{ {1}}可以用来识别典型的“可调用对象”(不是那些与内置函数类型根本不同的对象)。