Python 3.10中如何判断对象是否为method_descriptor类型
Python 3.10中如何判断对象是否为method_descriptor类型
嘿,这个问题我之前也折腾过,确实有点头疼——毕竟method_descriptor这种内置类型并没有直接暴露成我们能直接引用的类变量,不管是builtins还是types模块里都找不到它的身影。不过咱们有几种靠谱的办法来实现这个判断需求,我给你一一捋清楚:
方法一:借助已知的method_descriptor实例获取类
既然所有method_descriptor实例都属于同一个类,那我们可以先拿一个确定的实例(比如字符串的__add__方法),通过它的__class__属性拿到这个隐藏的类,之后就可以用isinstance来判断了:
# 先获取method_descriptor对应的类 method_descriptor_cls = str.__add__.__class__ # 现在就能正常用isinstance判断了 test_obj = list.__len__ is_method_desc = isinstance(test_obj, method_descriptor_cls) print(is_method_desc) # 输出True
像int.__sub__、dict.__getitem__这些都是现成的method_descriptor实例,随便挑一个来拿类就行。
方法二:用inspect模块的现成函数(最推荐)
Python的inspect模块其实已经封装好了专门判断方法描述符的函数,直接用就行,内部已经帮我们处理了这些内置类型的隐藏细节:
import inspect # 测试示例 print(inspect.ismethoddescriptor(str.__add__)) # True print(inspect.ismethoddescriptor(lambda x: x)) # False
这个方法最省心,也最可靠,适合绝大多数场景,包括你提到的Sphinx相关的需求。
方法三:基于类型名称和特征属性判断
如果不想额外导入模块,也可以通过检查对象的类型名称和专属属性来间接判断。method_descriptor的类型名称就是'method_descriptor',而且通常会带有__objclass__(关联的类)和__name__(方法名)属性:
def is_method_descriptor(obj): return ( type(obj).__name__ == 'method_descriptor' and hasattr(obj, '__objclass__') and hasattr(obj, '__name__') ) # 测试 print(is_method_descriptor(str.__add__)) # True print(is_method_descriptor(123)) # False
这种方法虽然不如前两种严谨,但胜在轻量,要是你的场景里不需要太严格的类型判断,这个也完全够用。
内容来源于stack exchange
相关产品推荐
相关产品推荐

