不支持 NoneType 和 str 的操作数类型

3
我收到一条消息,内容如下:
Traceback (most recent call last):
 File "/var/www/fosa/error_supressor.py", line 46, in <module>
   sys.stderr.write(latest + '\n')
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'

我已经试图解决这个问题好几天了,但实话说我是一个初学者。

让我们先把问题排列一下,看看是否有仁慈的人可以花些时间来帮助一个不起眼的陌生人解决问题 :-)

此外,当我检查错误日志时,我发现了这个错误信息,我怀疑它与问题有关:

File "/var/www/fosa/app/controllers/client/client.py", line 601, in detail
    if not course.bookable or not course.school.partner.active: # both objects are boolean 
AttributeError: 'NoneType' object has no attribute 'bookable'

你是如何出现错误的?是你自己写的代码吗?能否把导致错误的代码贴出来? - user220878
1
你写了这些文件吗?如果是,请给我们提供相关部分。 - Christian Mann
3
看了一眼,我认为你需要像这样做 sys.stderr.write(str(latest) + '\n'),因为 latest 不是字符串。但是这里贴出的一点代码可能会有所帮助。 - Bram
@Bram:是的,转换为字符串可能至少是一种很好的调试策略。 - nakedfanatic
2个回答

4
  • 有些东西将 None 绑定到 latest。找出是什么并修复逻辑错误。

  • 有些东西将 None 绑定到 course。找出是什么并修复等等。


3
显然从追溯中我们可以看到: - latest is None - course is None 在Python中,一个常见的模式是让变量名永远绑定到唯一的类型,除非赋予的最有意义的值是“null”值,此时将变量设置为None。例如,假设get(pk)从DB返回一个对象,但当没有与键pk对应的对象时,它会返回None。要修复这个错误,我会这样做:
编写如下代码:
if latest is None:
     # do something
else:
     sys.stderr.write(latest + '\n')

或者也许

sys.stderr.write('%s\n' % latest) #so that latest can be of any type

替代

sys.stderr.write(latest + '\n')

感谢您的回答。正如您可能猜到的那样,这段代码不是我编写的。最终我采用了这个建议:sys.stderr.write(latest + '\n')。当时有香槟庆祝,但是......现在我遇到了一个新错误,除了更改error_supressor中的代码之外,我什么也没做: File "/var/www/fosa/app/dispatcher.py", line 47, in redirect_course_detail '?valuta=' + str(currency_id), 301) AttributeError: 'NoneType' object has no attribute 'get_detail_url'我不确定要展示哪些代码,因为这3个错误必须相关,并且它们位于不同的文件、不同的对象中... - Hype

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接