如何在CPython中区分原生类型与用户自定义类型?
问题需求
需要在Python代码中(不使用CPython API)区分_functools.partial这类原生类与普通自定义类(例如:
class MyClass: pass
),仅支持CPython >=3.6。核心目标是识别那些**__dict__/__slots__无法返回全部对象属性**的类型——比如原生_functools.partial的func、args、keywords属性不在__dict__中,且不存在__slots__,本质是检查类型是否定义了非__slots__派生的Py_tp_members。
背景思路
functools.partial.__dict__通常为空或Nonefunctools.partial.__slots__仅在纯Python实现的Python环境中存在,常规CPython环境下不存在- Python >=3.11中
functools.partial.__getstate__()方法存在,调用后返回__dict__(可能包含__slots__),但原生partial调用该方法会返回空或None functools.partial.__dir__(functools.partial)不包含func等属性,但dir(functools.partial)包含;附带疑问:内置dir函数的行为有何不同?它处理这种情况的具体代码逻辑在哪里?推测它遍历了Py_tp_members或Py_tp_methods- 最初尝试用
__dictoffset__作为判断依据,但实际无效 - 内置
dir函数或inspect.getmembers/inspect.getmembers_static可能满足需求
需求原因
我们需要为任意类型的对象生成**稳定(跨Python版本哈希值不变)且有意义(包含所有相关状态)**的自定义哈希(非Python内置的__hash__方法)。目前的实现是遍历__getstate__()的返回值,或遍历__dict__/__slots__,但对functools.partial这类原生类型无效。计划添加原生类型检查逻辑,遇到这类情况时 fallback 到使用dir来获取对象的全部属性。
内容的提问来源于stack exchange,提问作者Albert
相关产品推荐
相关产品推荐

