объект к строке в Python



У меня есть некоторые объекты данных, на которых я хочу реализовать строку to и функции equals, которые идут в глубину.



Я реализовал str и eq и хотя равенство работает нормально, я не могу заставить 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__


Поскольку я не знаю типов атрибутов attr1, attr2 в моих объектах Bean (они могут быть списками, но также и наборами, словарями и т. д.) было бы неплохо иметь простое и элегантное решение, которое не было бы требуется проверка типа ...



Возможно ли это ?

620   2  

2 ответов:

Вы можете использовать __repr__ вместо __str__, который работает рекурсивно, хотя это не очень хорошая идея в большинстве случаев (посмотрите на Этот ответ для получения более подробной информации). Тем не менее, это работает для меня:

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

Вы можете попробовать использовать repr вместо str.

Я получил нижеприведенный вывод для print (t1), при использовании def repr(self): вместо str.

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

Дайте мне знать, если это решит вашу проблему. Прикрепление изображения Для справки.

С уважением, Винит

Comments

    Ничего не найдено.