Я кодировал пользовательский класс IntegerMod
для целых чисел по модулю простого числа.Все отлично работаетЗатем использовал их в качестве коэффициентов полиномов, построенных с numpy.poly1d
, и сумел реализовать достаточное количество методов в IntegerMod
, чтобы операции с этими полиномами работали так, как мне нужно (например, поиск интерполяционных полиномов по множеству точек).
Остается лишь небольшая деталь, это то, что print(pol)
для этих многочленов фактически терпит неудачу, потому что Python пытается использовать форматирование строки %g
для коэффициентов, и это не дает возможности сказать, что IntegerMod
должно быть строкой или числом.На самом деле IntegerMod
наследуется от numbers.Number
, но этого недостаточно.У меня вопрос, могу ли я реализовать в своем классе поведение для форматирования строки?Если нет, то как мне решить эту проблему?
MWE, выдающий ошибку:
import numbers
import numpy as np
class IntegerMod(numbers.Number):
def __init__(self, k, p):
self.k = k % p
self.p = p
def __repr__(self):
return "<%d (%d)>" % (self.k, self.p)
if __name__ == "__main__":
p = 13
coef1 = IntegerMod(2, p)
coef2 = IntegerMod(4, p)
print(coef1) # Works as expected
pol = np.poly1d([coef1, coef2])
print(pol)
""" # error:
s = '%.4g' % q
TypeError: float() argument must be a string or a number, not 'IntegerMod'
"""