Форматирование строк для пользовательских классов в Python - PullRequest
0 голосов
/ 01 февраля 2019

Я кодировал пользовательский класс 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'
    """

1 Ответ

0 голосов
/ 01 февраля 2019

Возможно, вам следует реализовать метод __float__, так как форматирование poly1d ожидает плавающие значения.

Примерно так

    def __float__(self):
        return float(self.k)
...