python - 为什么 python file-write 不会隐式调用类 __str__?
问题描述
为什么 Python 的文件写入不会自动调用__str__
?
$ cat person.py
class Person:
def __init__(self):
self.age = 22
def __str__(self):
return "my age is {}".format(self.age)
当我尝试打印它时,一切正常,但写入Person
文件失败:
>>> from person import Person
>>> dan = Person()
>>> print(dan)
my age is 22
>>> fl = open("dan.txt","wt")
>>> fl.write(dan)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: write() argument must be str, not Person
解决方案
这根本不是 API 的设计方式。
由 str(object) 和内置函数 format() 和 print() 调用,以计算对象的“非正式”或可打印的字符串表示。
除了那些明确列出的实例之外,没有理由期望会发生隐式转换。
并且根据的定义io.TextIOBase.write(s)
:
将字符串 s 写入流并返回写入的字符数。
所以它明确地期待一个字符串,这由错误消息确认。
最简单的解决方案是在将函数作为参数str()
传递之前使用函数执行转换:write()
fl.write(str(dan))
推荐阅读
- python - 如何自定义烧瓶用户注册和登录功能?
- mysql - 获取列名总和时得到错误答案
- objective-c - 如何以编程方式将 NSObjectController 置于实体模式?
- c++ - 如何在编译时检查是否支持 C++ 标准库(STL)
- java - Couchbase DefaultOrphanResponseReporter 观察到孤立响应
- c# - 在 Xamarin 中使用 PHP/Mysql 登录并重定向到另一个 XAML
- http2 - 如何在 HTTP2 中保持长连接?
- php - 尝试通过在现有数据库中输入新用户来在 laravel 中散列密码
- json - 使用 System.Text.Json 将科学记数法反序列化为 long
- php - 使用 PHP 或 Python 从 FTP 服务器读取或下载 5kb 文件,而不是下载或读取整个文件