HOWTO · Python
Python 中与 tostring() 等效的操作
了解 Python 中替代 tostring() 的工具:用 str() 转换值,用 join() 连接字符串,用 f-strings 或 str.format() 构建模板,并用 __str__() 自定义对象。
本页内容
Python 没有名为 tostring() 的方法;Java 中对应的方法拼写为 toString()。需要获取单个值的字符串表示时,请使用内置函数 str(value);需要合并多个字符串时使用 join();需要构建消息时使用 f-strings 或 str.format()。这些操作生成的是显示文本,而不是通用序列化格式。
使用 str() 转换值
str() 可为数字、集合以及大多数其他 Python 对象返回字符串。它直接回答了“Python 中与 tostring() 等效的操作是什么”这个问题。对于集合,结果是其可读表示,其中包括定界符和各元素的表示。
number = 123
values = [1, 2, 3]
print(str(number))
print(str(values))
输出:
123
[1, 2, 3]
两次调用的结果都是 str。以这种方式转换字典或列表并不会生成 JSON、CSV 或其他交换格式。如果另一个程序需要可靠地读取数据,请使用对应格式的专用库。
连接字符串和混合值
应在分隔符上调用 join(),而不是在列表上调用。传给 join() 的每个元素都必须已经是字符串。这个重要限制区分了字符串连接与一般转换。
words = ["Hello", "world", "from", "Python"]
sentence = " ".join(words)
mixed = "|".join(map(str, [1, "two", None]))
print(sentence)
print(mixed)
输出:
Hello world from Python
1|two|None
对于包含数字或其他对象的可迭代对象,map(str, values) 会在连接前转换每个元素。像 ", ".join(["one", 2]) 这样的直接调用会引发 TypeError,因为 join() 不会隐式转换非字符串元素。
使用 f-strings 格式化值
如果消息中包含值,并且在编写代码的位置已经知道模板,请使用 f-string。花括号中的表达式会被求值,并在格式化过程中完成转换。格式说明符可以控制精度、宽度以及其他显示细节。
name = "Ada"
score = 3.14159
message = f"{name} scored {score:.2f}"
print(message)
输出:
Ada scored 3.14
F-strings 在 Python 3.6 中引入,并且可用于当前的 Python 3.14 系列。对于局部且易读的模板,它们通常是最清晰的选择,但不应当用来序列化要传给其他系统的数据。
使用 str.format() 处理模板
如果模板单独存储、需要重复使用,或者必须支持早于 f-strings 的代码,str.format() 会很有用。它在替换编号字段或命名字段的同时转换传入的值。
item = "apple"
quantity = 5
message = "I have {quantity} {item}s.".format(quantity=quantity, item=item)
print(message)
输出:
I have 5 apples.
当模板包含多个值时,优先使用命名字段,这样更容易看清每个占位符与其值之间的关系。对于使用内联模板的新代码,f-string 通常更简短。
为自定义对象定义 __str__()
如果你的类需要实用且便于阅读的表示,请实现 __str__()。Python 会在计算 str(instance) 以及 print() 显示实例时调用它。该方法必须返回字符串,不能返回数字或其他对象。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"{self.name} ({self.age})"
person = Person("Ada", 36)
print(str(person))
输出:
Ada (36)
应让 __str__() 保持简洁并便于人们阅读。__repr__() 有不同的用途,主要面向调试和开发人员;定义其中一个并不能代替另一个。
限制与方法总结
请根据所需的结果选择相应操作:
- 对于单个值或集合的可读表示,使用
str(value)。 - 使用
separator.join(strings)合并字符串;必要时先用map(str, values)转换元素。 - 可读的内联模板使用 f-strings,可复用或单独存储的模板使用
str.format()。 - 如果你自己的类需要便于人们阅读的表示,请实现
__str__()。
这些方法不能保证生成可逆或机器可读的表示。处理 JSON 时,请使用 json.dumps(),并处理 JSON 无法表示的类型。对于自定义传输格式,应明确定义其模式,而不是依赖 str() 的输出。
简而言之,用 str(value) 替换 Java 风格的 tostring() 调用,然后根据连接、格式化或自定义文本的具体任务,选择 join()、f-string、str.format() 或 __str__()。