Python3"魔术功能"堆栈跟踪

时间:2014-10-13 06:41:04

标签: python ipython-magic

我发现自己处于这样一种情况:我在Python3(__add____sub__等中重新定义了我所谓的“神奇”属性或函数。)

对于所有这些,我实现了相同的两行代码:

arg1 = self.decimal if isinstance(self, Roman) else self
arg2 = other.decimal if isinstance(other, Roman) else other

这些行的细节并不重要,但是,我的代码中的冗余会分散注意力。还有另一个“神奇”功能,它在这个和它在REPL中调用之间的中间地带吗?

例如:

>> Class(9) + Class(3)
... (somewhere in python module)
... def __magicFunction__(self, rhs):
...   arg1 = self.decimal if isinstance(self, Roman) else self
...   arg2 = other.decimal if isinstance(other, Roman) else other
... 
... THEN
...
... def __add__(self, rhs):
...   return arg1 + arg2
...
12

使用类似这样的堆栈跟踪:

Traceback (most recent call last):  
  File "< stdin>", line 1, in < module>  
  File "/home/module.py", line 105, in ```__magicFunction__```  
  File "/home/module.py", line 110, in ```__gt__```  

我希望这是有道理的......

1 个答案:

答案 0 :(得分:1)

我不知道另一个神奇的功能,但是将你所使用的类的arg1和arg2永久变量设置为同样有效。然后为你调用的类创建一个方法来自其他所有魔法功能。

编辑:

实际上,为什么你不使用getattr?所以每个魔术函数看起来都像这样:

def __add__(self, rhs):
  return getattr(self, 'decimal', self) + getattr(other, 'decimal', other)