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

use*_*619 34 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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

Fed*_*lev 73

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

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


小智 31

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

def __str__(self):
    return self.pressid
Run Code Online (Sandbox Code Playgroud)

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

def __str__(self):
    return str(self.pressid)
Run Code Online (Sandbox Code Playgroud)

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


小智 6

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

在这里,你必须了解STR功能的工作:在STR温控功能,但主要是用来打印值,但实际上是被设计成返回一个字符串,不打印之一。在您的类中,str函数在不返回任何内容时直接调用print,这解释了您的错误输出。由于构建了格式化的字符串,并且由于函数未返回任何内容,因此使用None值。这是您的错误的解释

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

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

    def __str__(self):
        return self.summary
Run Code Online (Sandbox Code Playgroud)

但是,如果您要返回的值不是字符串类型,那么您可以像这样从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)
            `
Run Code Online (Sandbox Code Playgroud)