Can I overwrite the string form of a namedtuple?

前端 未结 3 1905
我寻月下人不归
我寻月下人不归 2020-12-24 05:34

For example:

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


        
相关标签:
3条回答
  • 2020-12-24 05:48

    Yes, it is not hard to do and there is an example for it in the namedtuple docs.

    The technique is to make a subclass that adds its own str method:

    >>> 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'
    

    Update:

    You can also used typing.NamedTuple to get the same effect.

    from typing import NamedTuple
    
    class Spoken(NamedTuple):
        
        loudness: int
        pitch: str
        
        def __str__(self):
            return str(self.loudness)
    
    0 讨论(0)
  • 2020-12-24 05:51

    You can define a function for it:

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

    and assign it to __str__:

    Spoken.__str__ = print_loudness
    
    0 讨论(0)
  • 2020-12-24 05:56

    you can use code like this:

    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))
    

    This will wrap namedtuple in a class of your choice which you then overload the str function too.

    0 讨论(0)
提交回复
热议问题