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

u91tlkcl  于 2023-06-20  发布在  Python
关注(0)|答案(9)|浏览(136)

我有一段代码可以创建一个新的音符。当我尝试打印时,我得到以下错误,即使它打印输出:

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)
o4tp2gmn

o4tp2gmn1#

方法__str__应该返回string,而不是print。

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

qij5mzcb2#

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

def __str__(self):
    return self.pressid

其中pressid是IntegerField类型对象。Django(和一般的Python)期望一个str函数的字符串,所以返回一个整数会导致这个错误被抛出。

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

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

kxeu7u2r

kxeu7u2r3#

您面临的问题是:类型错误: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函数返回字符串值

  • type将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)
            `
r1zk6ea1

r1zk6ea14#

在Model的__str__方法中,您将返回一个值null
例如:

class X(models.Model):
    name = models.CharField(_('Name'), null=True, blank=True, 
    max_length=150)
    date_of_birth = models.DateField(_('Date of birth'), null=True, blank=True)
    street = models.CharField(_('Street'), max_length=150, blank=True)
    
    def __str__(self):
        return self.name # here the value of name field might be null, so the

错误显示。
正确的__str__方法为:

def __str__(self):
    return str(self.name)
evrscar2

evrscar25#

我有同样的问题,在我的情况下,是因为我返回了一个数字:

def __str__(self):
    return self.code

String正在等待一个字符串,而不是另一个字符串。
现在工作良好:

def __str__(self):
    return self.name

其中name是一个字符串。

6ju8rftf

6ju8rftf6#

试试这个:

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

jbose2ul7#

我是Django的新手。但我分享我的经验,因为解决了同样的案件。
我的情况是,Someday(没有内存)将某个字段(memo)的属性更改(添加)为null=True。但我完全忘记了我的model.py如下。

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

所以我编辑了返回值到其他字段。就这样

y1aodyip

y1aodyip8#

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

6pp0gazn

6pp0gazn9#

我在Django Admin中得到了同样的错误:
TypeError:str返回非字符串(类型为NoneType)
当我定义name字段接受None值时,如下所示,然后我在Django Admin中保存了一个None值:

# "models.py"

class Person(models.Model):                            # Here
    name = models.CharField(max_length=20, blank=True, null=True)

    def __str__(self):
        return self.name

因此,我将self.name替换为str(self.name),如下所示,然后错误就解决了:

# "models.py"

class Person(models.Model):
    name = models.CharField(max_length=20, blank=True, null=True)

    def __str__(self):
        return str(self.name) # Here

相关问题