我有一个字典,它的值中包含对象。我想在字典上使用 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}"
也许你想要一个dict
子类:
class strdict(dict):
def __str__(self):
return "{%s}"%', '.join("%r: %s"%p for p in self.items())
考虑在 Python 2 中使用 iteritems
。
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
其位置参数。
这种方法可能会有所帮助。而不是像下面那样直接分配"t"。
>>> dict['object'] = t
您可以对其进行类型转换,然后将其保存到字典中。喜欢这个
>>> dict['object'] = str(t)
然后,字典将具有您需要的值。
>>> str(dict)
"{'object': '8'}"
如果你不介意迭代字典,我们可以写一个 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
。
如果您希望字典包含其他字典作为值,我们可能会使函数递归。