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__()