Подтвердить что ты не робот

Можно ли перезаписать строковую форму namedtuple?

Например:

>>> Spoken = namedtuple("Spoken", ["loudness", "pitch"])
>>> s = Spoken(loudness=90, pitch='high')
>>> str(s)
"Spoken(loudness=90, pitch='high')"

Я хочу:

>>> str(s)
90

То есть я хочу, чтобы строковое представление отображало атрибут громкости. Возможно ли это?

4b9b3361

Ответ 1

Да, это не сложно сделать, и есть пример для него в namedtuple docs.

Метод заключается в создании подкласса, который добавляет свой собственный метод str:

>>> from collections import namedtuple
>>> class Spoken(namedtuple("Spoken", ["loudness", "pitch"])):
        __slots__ = ()
        def __str__(self):
            return str(self.loudness)

>>> s = Spoken(loudness=90, pitch='high')
>>> str(s)
'90'

Ответ 2

Вы можете определить для него функцию:

def print_loudness(self):
    return str(self.loudness)

и назначьте его __str__:

Spoken.__str__ = print_loudness

Ответ 3

вы можете использовать такой код:

from collections import namedtuple

class SpokenTuple( namedtuple("Spoken", ["loudness", "pitch"]) ):

    def __str__(self):
        return str(self.loudness)

s = SpokenTuple(loudness=90, pitch='high')

print(str(s))

Это приведет к переносу namedtuple в класс по вашему выбору, который затем перегружает функцию str.