【Python入門】オブジェクトを文字列に変換する関数

 オブジェクトを文字列に変換する関数は、プログラムのデバッグやロギング、またオブジェクトの状態を外部に出力する際に非常に役立ちます。Pythonでは、主にrepr関数とascii関数が用いられます。これらの関数は、オブジェクトの「内部状態」や「表現」を文字列として返し、場合によってはそれをeval関数で再現できる形式になっています。
 この動画では、これらの関数の基本的な使い方と、その動作の違いについて、表や具体例を用いて詳しく解説します。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.基本の変換関数

1.1. repr関数の基本

 repr関数は、オブジェクトの正式な文字列表現(representation)を返します。返される文字列は、通常、開発者がオブジェクトの状態を理解するために用いられ、eval関数で元のオブジェクトに戻すことができる場合もあります。

repr(オブジェクト)
説明
repr("python")文字列 'python' の表現として、"'python'" を返す
repr(123)数値123は "123" として返される
# 例: repr関数を使って文字列と整数の表現を表示する
print("repr('python') =", repr("python"))  # 出力: "'python'"
print("repr(123) =", repr(123))            # 出力: "123"

実行結果

repr('python') = 'python'
repr(123) = 123

解説

  • repr("python") はシングルクォートで囲まれた文字列 "'python'" を返し、これは文字列の正確な再現を意図しています。
  • 数値の場合は、文字列表現がそのまま返されます。

1.2. ascii関数の基本

 ascii関数は、repr関数と同様にオブジェクトの表現を文字列で返しますが、非ASCII文字をエスケープシーケンス(\uXXXX や \xXX など)に変換して返します。これにより、出力が常にASCII文字だけで構成されます。

ascii(オブジェクト)
説明
ascii("python")ASCII文字だけの文字列 "'python'" を返す
ascii("パイソン")非ASCII文字がエスケープされ、"'\u30d1\u30a4\u30bd\u30f3'" を返す
# 例: ascii関数を使って文字列をASCII表現に変換する
print("ascii('python') =", ascii("python"))   # 出力: "'python'"
print("ascii('パイソン') =", ascii("パイソン"))  # 出力例: "'\\u30d1\\u30a4\\u30bd\\u30f3'"

実行結果

ascii('python') = 'python'
ascii('パイソン') = '\u30d1\u30a4\u30bd\u30f3'

解説

  • ascii("python") はrepr("python")と同じく "'python'" を返します。
  • 一方、ascii("パイソン") は日本語が含まれるため、各文字がUnicodeエスケープシーケンスに変換され、ASCII文字のみで構成された文字列となります。

2.応用例

2.1. repr関数とeval関数の組み合わせ

 repr関数で返された文字列は、場合によってはeval関数を使って元のオブジェクトに戻すことができます。これは、デバッグやシリアライズの検証に役立ちます。

# 例: repr関数で得た文字列表現からeval関数で元のオブジェクトに戻す
s = "Hello, World!"
repr_s = repr(s)
restored_s = eval(repr_s)
print("Original:", s)
print("Restored:", restored_s)

実行結果

Original: Hello, World!
Restored: Hello, World!

解説

  • 文字列sのrepr_sは "'Hello, World!'" となります。
  • eval(repr_s) により、repr文字列から元の文字列 "Hello, World!" が再生成されます。
  • これにより、repr関数の出力が再現性を持つことが確認できます。

2.2. 非ASCII文字の処理におけるascii関数の有用性

 非ASCII文字を含むオブジェクトを扱う際、ascii関数はデバッグ出力やログ記録において、環境依存の文字化けを避けるために便利です。

# 例: 非ASCII文字列のascii関数による変換
non_ascii = "こんにちは"
print("repr(non_ascii):", repr(non_ascii))   # 出力例: "'こんにちは'"
print("ascii(non_ascii):", ascii(non_ascii))   # 出力例: "'\\u3053\\u3093\\u306b\\u3061\\u306f'"

実行結果

repr(non_ascii): 'こんにちは'
ascii(non_ascii): '\u3053\u3093\u306b\u3061\u306f'

解説

  • repr(non_ascii) は元の日本語文字列をそのまま返しますが、環境によっては文字化けの可能性があります。
  • ascii(non_ascii) は、全ての非ASCII文字をUnicodeエスケープシーケンスに変換するため、常に安定したASCII出力が得られます。

まとめ

 オブジェクトを文字列に変換する関数は、デバッグ、ロギング、またはデータのシリアライズなど、さまざまな用途で利用されます。

  • repr関数は、オブジェクトの正確な表現を返し、eval関数と組み合わせることで元のオブジェクトに復元できる場合もあります。
  • ascii関数は、非ASCII文字をエスケープすることで、環境に依存しない安定した文字列表現を提供します。

 これらの関数を活用することで、プログラムの状態を正確かつ効率的に表現し、問題発生時の迅速なデバッグやテストが可能になります。