web-dev-qa-db-ja.com

Pythonの文字列へのオブジェクト

To文字列を実装するデータオブジェクトがいくつかあり、深さの関数に等しくなります。

streqを実装しましたが、平等はうまく機能しますが、strを同じように動作させることはできません。

class Bean(object):

    def __init__(self, attr1, attr2):
        self.attr1 = attr1
        self.attr2 = attr2

    def __str__(self):
        return str(self.__dict__)

    def __eq__(self, other):
        return self.__dict__ == other.__dict__

実行すると:

t1 = Bean("bean 1", [Bean("bean 1.1", "same"), Bean("bean 1.2", 42)])
t2 = Bean("bean 1", [Bean("bean 1.1", "same"), Bean("bean 1.2", 42)])
t3 = Bean("bean 1", [Bean("bean 1.1", "different"), Bean("bean 1.2", 42)])

print(t1)
print(t2)
print(t3)
print(t1 == t2)
print(t1 == t3)

私は得る:

{'attr2': [<__main__.Bean object at 0x7fc092030f28>, <__main__.Bean object at 0x7fc092030f60>], 'attr1': 'bean 1'}
{'attr2': [<__main__.Bean object at 0x7fc091faa588>, <__main__.Bean object at 0x7fc092045128>], 'attr1': 'bean 1'}
{'attr2': [<__main__.Bean object at 0x7fc0920355c0>, <__main__.Bean object at 0x7fc092035668>], 'attr1': 'bean 1'}
True
False

t1とt2には同じ値が含まれているため、equalsは(期待どおり)trueを返しますが、t3にはリストに異なる値が含まれているため、結果はfalseです(期待どおり)。私が望んでいるのは、to文字列に対して同じ動作をすることです(基本的には、リスト内の要素(またはsetまたはdict ...)についても深くなります)。

Print(t1)の場合、次のようなものを取得したいと思います。

{'attr2': ["{'attr2': 'same', 'attr1': 'bean 1.1'}", "{'attr2': 42, 'attr1': 'bean 1.2'}"], 'attr1': 'bean 1'}

私が行う場合、実際に取得されます:

Bean("bean 1", [Bean("bean 1.1", "same").__str__(), Bean("bean 1.2", 42).__str__()]).__str__

Beanオブジェクトの属性attr1、attr2のタイプがわからないため(リストだけでなく、セット、ディクショナリなど)、タイプチェックを必要としないシンプルでエレガントなソリューションがあると便利です...

これは可能ですか?

12
Valerian

__repr__の代わりに__str__を使用できます。これは再帰的に機能しますが、ほとんどの場合それは良い考えではありません(詳細については this answerをご覧ください)。それにもかかわらず、これは私のために働く:

def __repr__(self):
    return str(self.__dict__)
27
alexpeits

strの代わりにreprを使用してみてください。

Strの代わりにdefrepr(self):を使用すると、print(t1)の出力が次のようになりました。

{'attr1': 'bean 1'、 'attr2':[{'attr1': 'bean 1.1'、 'attr2': 'same'}、{'attr1': 'bean 1.2' 、 'attr2':42}]}

これで問題が解決するかどうか教えてください。参照用に image を添付します。

よろしく、ヴィニス

2
Vinith Srinivas