Трассировка стека Python3 "магические функции"

Я нахожусь в ситуации, когда я переопределяю множество так называемых "магических" атрибутов или функций моего класса в 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 ответ

Решение

Я не знаю о другой магической функции, но, вероятно, было бы столь же продуктивно сделать arg1 и arg2 постоянными переменными класса, в котором вы находитесь. Затем создайте метод для класса, который вы вызываете из любой другой магической функции.

РЕДАКТИРОВАТЬ:

на самом деле, почему бы вам просто не использовать getattr? поэтому каждая магическая функция будет выглядеть примерно так:

def __add__(self, rhs):
  return getattr(self, 'decimal', self) + getattr(other, 'decimal', other)
Другие вопросы по тегам