You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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__通常为空或None
  • functools.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:09:52