HOWTO · Python
Python での tostring() 相当の処理
Python で tostring() を置き換える方法を解説します。変換には str()、文字列の結合には join()、テンプレートには f-strings または str.format()、独自オブジェクトには __str__() を使います。
このページの内容
Python には tostring() というメソッドはありません。Java の対応するメソッドは toString() と表記します。1 つの値を文字列表現にするには、組み込みの 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
数値などのオブジェクトを含む iterable では、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() を使う
str.format() は、テンプレートを別に保存する場合、再利用する場合、または f-strings より前のコードに対応する必要がある場合に便利です。番号付きフィールドや名前付きフィールドを置き換えながら、渡された値を変換します。
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__() はデバッグや開発者向けという別の目的を持つため、片方を定義してももう片方の代わりにはなりません。
制約とメソッドのまとめ
必要な結果に合う処理を選んでください。
- 1 つの値、またはコレクションの読みやすい表現には
str(value)を使います。 - 文字列の結合には
separator.join(strings)を使い、必要なら先にmap(str, values)で要素を変換します。 - 読みやすいインラインテンプレートには f-strings、再利用するテンプレートや別に保存するテンプレートには
str.format()を使います。 - 独自クラスに人が読みやすい表現が必要な場合は、
__str__()を実装します。
これらの方法では、元に戻せる表現や機械可読な表現は保証されません。JSON には json.dumps() を使い、JSON で表現できない型を適切に処理してください。独自の通信形式では、str() の出力に頼らず、スキーマを明示的に定義します。
要するに、Java 風の tostring() 呼び出しは str(value) に置き換えます。そのうえで、文字列の結合、フォーマット、表示のカスタマイズという目的に応じて、join()、f-string、str.format()、または __str__() を選んでください。