我刚刚写了一些看起来不太合我的口味的代码,我认为还有更 Pythonic 的惯例。

我有一个类,我想将其与另一个对应的 __mul__ 方法一起进行显式求乘法。我明显应该在其中一个中进行计算,让另一个呼叫。

我的理解是, __mul__ 形式应该返回 NotImplemented,而 mul 根据类型对象中乘法没有定义时应触发 TypeErrorNotImplementedError(我不确定哪一个)。所以目前,我有

    def mul(self, other: object) -> "CrtElement":
        if isinstance(other, CrtElement):
            ...
        elif isinstance(other, int):
            ...
        ... # 对其他类型操作
        else:
            raise TypeError


    def __mul__(self, other: object) -> "CrtElement":
        try:
            return self.mul(other)
        except TypeError:
            return NotImplemented

所以,最终问题是:

1.我是正确的吗?我认为 __mul__ 在这种情况下应该返回 NotImplemented,同时 mul 应该引发错误?(我相信答案是 “是” 的,但我想确认我的假设)

2 是否应该在 mul 中引发 TypeError 或 NotImplementedError?

3 我应该对其他方向的包装进行操作吗?也就是说,我是否应该把 mul调用__mul__,而不是我当前的__mul__调用多??

4 我们是否有更简单,更 Pythonic 规定的更好的方法?