Python:“TypeError:__str__返回非字符串”但仍打印到输出?

时间:2012-08-08 18:53:03

标签: python

我有这段代码创建一个新笔记..我尝试打印我得到以下错误,即使它打印输出

Error:
C:\Python27\Basics\OOP\formytesting>python notebook.py
Memo=This is my first memo, Tag=example
Traceback (most recent call last):
  File "notebook.py", line 14, in <module>
    print(firstnote)
TypeError: __str__ returned non-string (type NoneType)

note.py

import datetime
class Note:
    def __init__(self, memo, tags):
        self.memo = memo
        self.tags = tags
        self.creation_date = datetime.date.today()

    def __str__(self):
        print('Memo={0}, Tag={1}').format(self.memo, self.tags)


if __name__ == "__main__":
    firstnote = Note('This is my first memo','example')
    print(firstnote)

7 个答案:

答案 0 :(得分:68)

方法__str__应该返回字符串,而不是打印。

def __str__(self):
    return 'Memo={0}, Tag={1}'.format(self.memo, self.tags)

答案 1 :(得分:28)

您也可以用str()包围输出。我遇到了同样的问题,因为我的模型有以下内容(作为简化示例):

def __str__(self):
    return self.pressid

其中pressid是IntegerField类型对象。 Django(以及一般的python)需要一个 str 函数的字符串,因此返回一个整数会导致抛出此错误。

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

这解决了我在Django管理方面遇到的问题。希望它对你的帮助。

答案 2 :(得分:3)

您面临的问题是: TypeError: str 返回了非字符串(类型为NoneType)

在这里您必须了解 str 函数的工作原理: str 功能,尽管通常用于打印值,但实际上旨在返回一个字符串,而不是打印一个字符串。 在您的类中, str 函数在不返回任何内容的情况下直接调用print,这解释了您的错误输出。由于构建了格式化的字符串,并且由于我们的函数未返回任何内容,因此使用None值。 这是对您的错误的解释

您可以使用 str 函数中的return来解决此问题,例如: *仅返回字符串值,而不是打印

 class Summary(models.Model):
   book = models.ForeignKey(Book,on_delete = models.CASCADE)
   summary = models.TextField(max_length=600)

    def __str__(self):
        return self.summary

但是,如果您要返回的值不是字符串类型,则可以这样操作,以从 str 函数返回字符串值

*类型将值转换为 str 函数返回的字符串

class Summary(models.Model):
   book = models.ForeignKey(Book,on_delete = models.CASCADE)
   summary = models.TextField(max_length=600)

   def __str__(self):
       return str(self.summary)
            `

答案 3 :(得分:0)

试试这个:

def __str__(self):
    return f'Memo={self.memo}, Tag={self.tags}'

答案 4 :(得分:0)

我遇到了同样的问题,就我而言,是因为我返回了一个数字:

def __str__(self):
    return self.code

str 正在等待一个 str,而不是另一个。

现在可以很好地与:

def __str__(self):
    return self.name

其中 name 是一个字符串。

答案 5 :(得分:0)

我是 Django 的新手。 但我分享我的经验,因为解决了同样的案例。

我的情况是,某天(没有记忆)将某些字段(备忘录)的属性更改(添加)为 null=True。但我完全忘记了我的model.py如下。

def __str__(self):
    if self is not None:
        return self.author.memo

所以我将返回值编辑为其他字段。仅此而已。

答案 6 :(得分:0)

您的表中可能有一些空值。进入mysql并删除表中的空值。