已关闭
[Bug] DynamicEmbInitializerArgs.__eq__ 返回 NotImplementedError 对象而非 NotImplemented 常量,违反 Python 数据模型 #1314
崇理战队创建于  8月11日关闭于  8月23日
崇理战队
8月11日 创建

问题描述

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 基础数据模型的错误,在动态类型环境中可能引发难以诊断的问题。

likedislike
xiangjie10成员
8月11日 评论:

👋 您好,感谢向 RecSDK 提交 Issue!
🎉 我们已收到您的反馈,感谢你对开源社区的支持!

📅 处理时效 维护团队将在工作日 24 小时内查看并回复您的问题。
🔍 自助排查(推荐优先查看) 在等待回复期间,您可以先查阅仓库README以及历史 Issue 中相似问题的解决方案,多数问题可快速解决。
💡 为了更快定位问题,请您确保 Issue 包含:

  • 清晰的问题描述
  • 可复现的操作步骤
  • 相关日志、截图或环境信息
    我们会尽快跟进,感谢您的理解与配合!
likedislike
xiangjie10成员
8月11日 评论:

/label add triaged

likedislike
ascend-robotascend-robot成员
8月11日 添加了label:bug
ascend-robotascend-robot成员
8月11日 添加了label:triaged
taoqiuyu1998
taoqiuyu1998成员
8月12日 评论:

与recsys-examples开源实现的dynamicemb保持一致。NotImplementedError是Python的内置异常继承自 RuntimeError,非问题

likedislike
taoqiuyu1998
taoqiuyu1998成员
8月12日 评论:

/label add resolved

likedislike
ascend-robotascend-robot成员
8月12日 添加了label:resolved
huangleihuanglei成员
8月12日 关联了看板:MindSDK版本issue看板
ascend-robot
ascend-robot成员
8月19日 评论:

您好,当前Issue标记为resolved且有一段时间未进一步更新,因此我们将其标记为'stale'(闲置)状态。若您认为这是误操作,可通过添加任意评论来去除'stale'标签。标记为stale的Issue在4天内无更新活动将自动关闭。

likedislike
ascend-robotascend-robot成员
8月19日 添加了label:stale
ascend-robotascend-robot成员
8月23日 关闭了 issue
taoqiuyu1998taoqiuyu1998成员
17 天前 关联了里程碑:MindSDK 26.2.0
taoqiuyu1998taoqiuyu1998成员
16 天前 issue状态由 TODO 改变为 DONE