【问题标题】:Why does print expect __str__ to return str?为什么 print 期望 __str__ 返回 str?
【发布时间】:2023-09-08 10:34:01
【问题描述】:

Print 打印 dict 没有问题:

d = dict()
d['x'] = 'y'
print(d)

{'x': 'y'}

那为什么会失败呢?

class Utterance:
    def __init__(self, intent_name, text):
        self.intent_name = intent_name
        self.text = text

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

print(utterance)
Traceback (most recent call last):
    print(utterance) TypeError: __str__ returned non-string (type dict)

(我知道__str__返回字符串是标准的,但我有一个与JSON编码相关的原因返回dict)

【问题讨论】:

  • 你读过这个吗:*.com/questions/47452513/…
  • 整个对象模型期望__str__能够很好地返回一个字符串...甚至dicts __str__使用它的数据来构建一个返回的字符串。 .. 你可以做return str(dict(self.__dict__))... (或者制作一个自定义方法来返回一个字典,然后让你的__str__ 方法返回那个str
  • 为什么不使用 JSON 表示? return json.dumps(self.__dict__)
  • __str__ 期望返回 str
  • @lonut Ticus 使用 dict 方法仍然不能解决我的问题。我需要的是这个(字典类) [{'intent_name': 'i1', 'text': 'u1'}, {'intent_name': 'i1', 'text': 'u2'}] {'intent_name': 'i1', 'text': 'u1'} json.dumps(self.__dict__) 返回不在这里的字符串

标签: python json


【解决方案1】:

来自documentation

object.__str__(self)
由 str(object) 和内置函数 format() 和 print() 调用,以计算对象的“非正式”或可良好打印的字符串表示。返回值必须是字符串对象。

tl;dr
为什么 print 期望 str 返回 str?

因为语言规范是这样说的。

【讨论】:

    【解决方案2】:

    object.__str__ 旨在返回对象的人类可读字符串表示形式,在您的情况下,此方法返回 dict,您可以使用:

    class Utterance:
        def __init__(self, intent_name, text):
            self.intent_name = intent_name
            self.text = text
    
        def __str__(self):
            return self.__dict__.__str__()
    
    print(Utterance(1, 'my_text'))
    

    输出:

    {'intent_name': 1, 'text': 'my_text'}
    

    【讨论】: