【问题标题】:__repr__ for an attribute that can be a string or None?__repr__ 对于可以是字符串或无的属性?
【发布时间】:2013-04-19 23:21:53
【问题描述】:

鉴于这个简单的类:

class Foo(object):
    def __init__(self,a=None):
        self.a = a
    def __repr__(self):
        return "Foo(a='{self.a}')".format(self=self)

我想知道是否有一种简单的方法可以让 __repr__ 根据 a 的类型返回不同的格式:

Foo('some_string') # if a is a string
Foo(5)             # if a is the integer 5
Foo(None)          # if a is None

显然,对于单个属性,我可以测试并具有不同的输出字符串,但我认为肯定有人在我之前解决了这个问题。具体来说,我有几个属性可以是字符串或无,我认为为__repr__ 编写复杂的逻辑没有多大意义。

【问题讨论】:

  • 感谢 Martijn 的快速解答!现在,有没有人有任何处理可选参数的“技巧”?我认为 Foo() 比 Foo(None) 漂亮得多...

标签: python repr


【解决方案1】:

只需使用self.arepr()

return "Foo(a={self.a!r})".format(self=self)

!r 告诉.format()self.a 上调用repr(),而不是在值上调用__format__(),参见Format String syntax

>>> '{!r}'.format(0)
'0'
>>> '{!r}'.format('foo')
"'foo'"

演示:

>>> Foo(0)
Foo(a=0)
>>> Foo('foo')
Foo(a='foo')
>>> Foo(None)
Foo(a=None)

【讨论】:

  • 你可能想把引号放到"Foo(a={self.a!r})"
【解决方案2】:

虽然我接受了 Martijn 的回答,但我想更清楚地明确展示他的建议的结果:

>>> class Foo(object):
...     def __init__(self, a=None, b=None):
...         self.a = a
...         self.b = b
...     def __repr__(self):
...         return 'Foo(a={self.a!r}, b={self.b!r})'.format(self=self)
...      
>>> Foo(a='a')
Foo(a='a', b=None)
>>> Foo(a=5)
Foo(a=5, b=None)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-24
    • 2018-06-26
    • 1970-01-01
    • 2012-05-07
    • 2020-05-09
    • 2012-11-23
    • 1970-01-01
    • 2019-04-29
    相关资源
    最近更新 更多