0

この単純なクラスを考えると:

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

__repr__のタイプに応じて異なるフォーマットを返す簡単な方法があるかどうか疑問に思っています:

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

明らかに、単一の属性について、テストして異なる出力文字列を作成できますが、誰かが私の前にこれに取り組んだに違いないと考えています。具体的には、文字列または None にすることができるいくつかの属性があり、複雑なロジックを記述して__repr__もあまり意味がないと思います。

4

2 に答える 2

3

のを使用するだけrepr()ですself.a

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

は、値を呼び出す代わりにonを呼び出すよう!r指示します。 Format String syntaxを参照してください。.format()repr()self.a__format__()

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

デモ:

>>> Foo(0)
Foo(a=0)
>>> Foo('foo')
Foo(a='foo')
>>> Foo(None)
Foo(a=None)
于 2013-04-25T21:52:23.027 に答える
2

While I accepted Martijn's answer, I wanted to explicitly show the results of his suggestion a little more clearly:

>>> 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)
于 2013-04-25T22:14:21.473 に答える