代码之家  ›  专栏  ›  技术社区  ›  SuperGeo

正在重写\uu add\uuuuu,尝试super()时未捕获异常__添加__

  •  0
  • SuperGeo  · 技术社区  · 8 年前

    我正在尝试将熊猫分类 Timedelta 所以当它被一个整数/浮点数求和时,我们认为它是 时间增量 用秒数。

    我尝试了以下方法:

    class Timedelta(pd.Timedelta):
        def __add__(self, other):
            print("OVERRIDEN ADD")
            try:
                print("SUPER ADD")
                return super().__add__(other)
            except:
                print("NEW ADD")
                return super().__add__(Timedelta(str(other)+"s"))
    

    但由于某种原因,我不能把它送到 "NEW ADD" 实施:

    >>> a = Timedelta2('10s')
    >>> a+1
    OVERRIDEN ADD
    Traceback (most recent call last):
      File "C:\Python36\lib\site-packages\IPython\core\interactiveshell.py", line 2910, in run_code
    SUPER ADD
        exec(code_obj, self.user_global_ns, self.user_ns)
      File "<ipython-input-51-98b939904c8e>", line 1, in <module>
        a+1
    TypeError: unsupported operand type(s) for +: 'Timedelta2' and 'int'
    

    我早就料到了 TypeError 异常将被捕获,但由于某些原因,它不是,所以我想寻求一些帮助,以了解这里可能发生的情况。

    谢谢

    2 回复  |  直到 8 年前
        1
  •  4
  •   user2357112    8 年前

    super().__add__(other) 不会引发异常!它返回 NotImplemented . 这就是你如何表示你的操作符重载不理解它得到的论点。这个 TypeError 来自操作员机器,一旦双方都表示无法执行操作。

    与其试图捕获一个无论如何都不会出现的异常,不如检查 超级()__添加\(其他) 退货 未实施 .

        2
  •  1
  •   Frank AK    8 年前

    你不是真的明白 __add__ 方法尝试下面的方法来实现您的期望! try ... expect 效率不高,因此您应该使用 if .. else 相反

    import pandas as pd
    
    class MyTimedelta(pd.Timedelta):
        def __add__(self, other):
            print("OVERRIDEN ADD")
            if isinstance(other, int):
                return pd.Timedelta("{}s".format(int(self.seconds)+ other))
            else:    
                super(MyTimedelta, self).__add__(other)
    

    然后您可以执行以下操作:

    In [22]: s=MyTimedelta('2s')
    
    In [23]: s+3
    OVERRIDEN ADD
    Out[23]: Timedelta('0 days 00:00:05')