已关闭
[Bug] DynamicEmbInitializerArgs.__eq__ 返回 NotImplementedError 对象而非 NotImplemented 常量,违反 Python 数据模型 #1314
崇理战队创建于 8月11日关闭于 8月23日
xiangjie10
8月11日 评论:
8月11日 评论:
👋 您好,感谢向 RecSDK 提交 Issue!
🎉 我们已收到您的反馈,感谢你对开源社区的支持!
📅 处理时效 维护团队将在工作日 24 小时内查看并回复您的问题。
🔍 自助排查(推荐优先查看) 在等待回复期间,您可以先查阅仓库README以及历史 Issue 中相似问题的解决方案,多数问题可快速解决。
💡 为了更快定位问题,请您确保 Issue 包含:
- 清晰的问题描述
- 可复现的操作步骤
- 相关日志、截图或环境信息
我们会尽快跟进,感谢您的理解与配合!


xiangjie10
8月11日 评论:
8月11日 评论:
/label add triaged


8月11日 添加了label:bug
8月11日 添加了label:triaged
taoqiuyu1998
8月12日 评论:
8月12日 评论:
与recsys-examples开源实现的dynamicemb保持一致。NotImplementedError是Python的内置异常继承自 RuntimeError,非问题


taoqiuyu1998
8月12日 评论:
8月12日 评论:
/label add resolved


8月12日 添加了label:resolved
8月12日 关联了看板:MindSDK版本issue看板
ascend-robot
8月19日 评论:
8月19日 评论:
您好,当前Issue标记为resolved且有一段时间未进一步更新,因此我们将其标记为'stale'(闲置)状态。若您认为这是误操作,可通过添加任意评论来去除'stale'标签。标记为stale的Issue在4天内无更新活动将自动关闭。


8月19日 添加了label:stale
8月23日 关闭了 issue
17 天前 关联了里程碑:MindSDK 26.2.0
16 天前 issue状态由 TODO 改变为 DONE
问题描述
training/torch_rec_v2/dynamic_emb/dynamic_emb/distributed/dynamicemb_config.py中DynamicEmbInitializerArgs.__eq__方法返回NotImplementedError(异常类)而非NotImplemented(内置常量)。这导致与不支持的类型比较时抛出异常而非让 Python 继续尝试另一操作数的__eq__。问题代码
@dataclass class DynamicEmbInitializerArgs: mode: DynamicEmbInitializerMode = DynamicEmbInitializerMode.UNIFORM # ... fields ... def __eq__(self, other): if not isinstance(other, DynamicEmbInitializerArgs): return NotImplementedError # ← 错误 if self.mode == DynamicEmbInitializerMode.NORMAL: return self.mean == other.mean and self.std_dev == other.std_dev # ... return True def __ne__(self, other): if not isinstance(other, DynamicEmbInitializerArgs): return NotImplementedError # ← 同样错误 return not (self == other)问题分析
Python 数据模型规定:当二元操作(如
==)对操作数的类型组合不支持时,应返回内置单例NotImplemented,这让 Python 有机会尝试反向操作数的方法。如果返回NotImplementedError,这会被 Python 视为一个普通对象(truthy 值),导致==直接返回这个异常对象具体表现:
>>> args = DynamicEmbInitializerArgs() >>> result = args == "some_string" >>> result <class 'NotImplementedError'> # 这是一个异常类对象,不是 True/False >>> bool(result) True # 对象是 truthy,所以 args == "str" 被当作 True 处理这不仅让比较结果始终为 truthy,还污染了相等比较的语义。
__ne__同样受影响。修复建议
def __eq__(self, other): if not isinstance(other, DynamicEmbInitializerArgs): return NotImplemented # ... def __ne__(self, other): if not isinstance(other, DynamicEmbInitializerArgs): return NotImplemented return not (self == other)注意:Python 的
@dataclass在frozen=True或eq=True(默认)时会自动生成正确的__eq__方法。如果手动定义__eq__,需要确保行为与 dataclass 装饰器兼容——更好的做法是删除手动定义,让 dataclass 处理。严重程度
中 - 虽然当前代码路径中不太可能将
DynamicEmbInitializerArgs与字符串或其他类型做比较,但这是 Python 基础数据模型的错误,在动态类型环境中可能引发难以诊断的问题。