将namedtuple的__str__和__repr__行为带入常规类

杰罗米

https://mail.python.org/pipermail/python-ideas/2014-September/029310.html

我一直以为namedtuple内置__str__并且__repr__非常整洁,我正在寻找一种简单的方法将其轻松地应用到我的任何类别。

>>> from collections import namedtuple
>>> A  = namedtuple("A", ["foo"])
>>> print(A(foo=1))
A(foo=1)
>>> str(A(foo=1))
'A(foo=1)'
>>> repr(A(foo=1))
'A(foo=1)'

编辑:

我最初是从一堆冗长的,不是动态的,硬编码开始的__repr__我不喜欢 namedtuple会自动完成吗?

def __repr__(self):
    return 'className(attrA={attrA}, attrB={attrB})'.format(**vars(self)))
杰罗米

有点黑,但这是这样做的:

from collections import namedtuple

def nice_repr(obj):
    def nice_repr(self):
        return repr(
            namedtuple(
                type(self).__name__,
                vars(self)
            )(**vars(self))
        )

    obj.__repr__ = nice_repr

    return obj

例:

@nice_repr
class A:
    def __init__(self, b, c):
        self.b = b
        self.c = c

print(repr(A(1, 2)))  # Outputs: A(c=2, b=1)

编辑:(故障安全版本)

def nice_repr(obj):
    """ Decorator to bring namedtuple's __repr__ behavior to regular classes. """

    def nice_repr(self):
        v = vars(self)

        # Prevent infinite looping if `vars` happens to include `self`.
        del(v['self'])

        return repr(namedtuple(type(self).__name__, v)(**v))

    obj.__repr__ = nice_repr

    return obj

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章