我有一个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__
的类和对象,但是我希望这些类和对象分别处理。
答案 0 :(得分:1)
types
模块提供了许多“实现”类型的名称,包括几种用C实现的函数的名称。type("".__str__)
的特定示例MethodWrapperType
刚刚在CPython3.7中添加。
由于该区域很细微,类型数量很多,callable
可能确实是最佳选择。您可以轻松地先检查type
个对象以“排除”类,然后使用各种启发式方法( eg ,try
调用对象上的vars
或检查{ {1}}可以用来识别典型的“可调用对象”(不是那些与内置函数类型根本不同的对象)。