2017-06-22 7 views
0

私はコンストラクタが*kwargsを受け入れ、それらを属性として設定するオブジェクトを持っています。Pythonリテラルでオブジェクトの文字列表現をPythonで作成します

>>> obs = Observable(foo=1, bar=5, _bazz=12, name='Amok', props=('One', 'two')) 
>>> print(x) 
Observable(bar=5, foo=1, name='Amok', props=('One', 'two')) 

私はカスタム__repr__追加しようとしました:私は次のようにオブジェクトを表現するために、印刷したい

class Observable(object): 
    def __init__(self, **kwargs): 
     for key in kwargs.keys(): 
      setattr(self, key, kwargs[key]) 

それ以上の入力の場合

class Observable(object): 
    def __init__(self, **kwargs): 
     for key in kwargs.keys(): 
      setattr(self, key, kwargs[key]) 

    def __repr__(self): 
     atribs = [(atrib, self.__dict__[atrib]) for atrib in self.__dict__.keys() if not '_' == atrib[0]] 
     atrib_strs = [] 
     for atrib, val in atribs: 
      atrib_strs.append('{}={}'.format(atrib, val)) 

     out_str = '{}({})'.format(self.__class__.__name__, ', '.join(atrib_strs)) 
     return out_str 

が印刷されます。

Observable(foo=1, bar=5, name=Amok, props=('One', 'two')) 

私は、'Amok'の代わりにAmokがあることを懸念しています。 文字列の型チェックを追加できますが、おそらくPython型の正しい文字列表現を取得する方法がありますか?多分標準ライブラリ関数ですか?

+1

私は質問に目を通していませんが、私のocdはPythonやPythonの代わりにpythonically *を見るために私を殺しています。 – void

+0

@s_vishnuありがとう、固定 – Euphe

+0

ハハの仲間。私が解決策を試すのを待ちます。 – void

答えて

3

これを実現する簡単な方法は、すべての属性値の__repr__()repr()で呼び出すことです。そうすれば、各文字列表現は で、が表示されます。

>>> class Observable(object): 
    def __init__(self, **kwargs): 
     for key in kwargs.keys(): 
      setattr(self, key, kwargs[key]) 

    def __repr__(self): 
     atribs = [(atrib, self.__dict__[atrib]) for atrib in self.__dict__.keys() if not '_' == atrib[0]] 
     atrib_strs = [] 
     for atrib, val in atribs: 
      atrib_strs.append('{}={}'.format(atrib, repr(val))) # add repr() call 

     out_str = '{}({})'.format(self.__class__.__name__, ', '.join(atrib_strs)) 
     return out_str 

>>> ob = Observable(foo=1, bar=5, _bazz=12, name='Amok', props=('One', 'two')) 
>>> print(ob) 
Observable(foo=1, name='Amok', props=('One', 'two'), bar=5) 
>>> 
+0

'dict.keys'を使用しないでください。代わりに' dict.items'/'dict.iteritems'を使用しますか? –

+1

@AzatIbrakov彼は表現に「私的な」変数を含めることを望んでいないので。彼のコードは改善することができましたが、私は実際にはあまり試していませんでした。 –

関連する問題