我有一个字典,该字典在其值中包含对象。我想在字典上使用str
函数,以便它将在字典中的所有其他对象上递归运行。
例如,我有以下对象:
>>> class Temp(object):
... def __init__(self):
... self._item = 8
... def __str__(self):
... return str(self._item)
...
>>> t = Temp()
>>> str(t)
'8'
我创建一个字典并将对象放入其中:
>>> dict = {}
>>> dict['object'] = t
现在,当我在字典上使用str函数时,我得到以下信息:
>>> str(dict)
"{'object': <__main__.Temp object at 0x7fa08889f910>}"
但是我想得到这个:
>>> str(dict)
"{'object': 8}"
答案 0 :(得分:6)
也许您想要一个dict
子类:
class strdict(dict):
def __str__(self):
return "{%s}"%', '.join("%r: %s"%p for p in self.items())
考虑在Python 2中使用iteritems
。
答案 1 :(得分:3)
dict
在对对象进行字符串化时使用对象的__repr__
。丢失的__str__
将故障转移到__repr__
,反之则不成立:__repr__
不会故障转移到__str__
。
获得所需结果的最简单方法是将__str__
重命名为__repr__
:
class Temp(object):
def __init__(self):
self._item = 8
def __repr__(self):
return str(self._item)
print({'object': Temp()})
产生
{'object': 8}
同时,由于故障转移,正常的字符串表示形式将与以前相同:
print(Temp())
产生
8
请记住,print
会在其位置参数上调用str
。
答案 2 :(得分:0)
这种方法可能会有所帮助。不必像下面那样直接分配“ t”。
>>> dict['object'] = t
您可以键入它,然后将其保存到词典中。像这样
>>> dict['object'] = str(t)
然后,词典将具有您需要的值。
>>> str(dict)
"{'object': '8'}"
答案 3 :(得分:0)
如果您不介意遍历该字典,我们可以用str代替:
def nerez_str(d):
new_d = {}
for k, v in d.items():
new_d[str(k)] = str(v)
return new_d
现在,不要在您的字典上调用str
,而是将其传递给nerez_str
。
如果您希望字典包含其他字典作为值,则可以使函数递归。