Pythonのstr()関数とrepr()関数の違いをわかりやすく解説
str()とrepr()の基本的な役割
Python公式ドキュメントによると、__repr__はオブジェクトの「公式(official)」な文字列表現を取得するために使われ、__str__は「非公式(informal)」な文字列表現を取得するために使われると説明されています。
具体的には、print文や組み込み関数str()はオブジェクトの表示に__str__を使用し、組み込み関数repr()は__repr__を使用してオブジェクトを表示します。ここからは、実際の例を使って両者の動作の違いを見ていきましょう。
datetimeオブジェクトでの実例
まず、datetimeオブジェクトを作成します。
>>> import datetime
>>> today = datetime.datetime.now()
str()を使った場合
組み込み関数str()でtodayを表示してみます。
>>> str(today)
'2018-01-12 09:21:58.130922'
日付が、ユーザーにとって読み取りやすい形式の文字列として表示されました。これが「非公式」な、人間向けの表現です。
repr()を使った場合
次に、組み込み関数repr()を使ってみましょう。
>>> repr(today)
'datetime.datetime(2018, 1, 12, 9, 21, 58, 130922)'
こちらも文字列が返されましたが、この文字列はdatetimeオブジェクトの「公式」な表現です。つまり、この「公式」な文字列表現からは、元のオブジェクトを再構築できるという特徴があります。
>>> eval('datetime.datetime(2018, 1, 12, 9, 21, 58, 130922)')
datetime.datetime(2018, 1, 12, 9, 21, 58, 130922)組み込み関数eval()は文字列を受け取り、それをdatetimeオブジェクトへと変換します。このように、repr()の出力はデバッグやログ出力において、オブジェクトの正確な状態を把握するのに役立ちます。
クラス設計におけるベストプラクティス
以上のことから、一般的には自分で作成するすべてのクラスには__repr__を実装しておくべきであり、datetimeのようにオブジェクトの文字列版があると便利だと考えられる場合は、さらに__str__も定義するとよいでしょう。開発者向けの正確な情報は__repr__で、エンドユーザー向けの分かりやすい表示は__str__で担う、という使い分けがPythonの慣習です。
-
Pythonで文字列から日付を抽出・解析する方法
文字列から日付を抽出するには、まずその文字列内で日付がどのような形式(フォーマット)で表現されているかを把握しておく必要があります。基本的なアプローチとしては、正規表現(reモジュール)で日付部分を取り出し、datetime.datetime.strptime() で解析(パース)するという流れになります。例えば、文字列中に「YYYY-MM-DD」形式の日付が含まれている場合、以下のコードで抽出と解析ができます。コード例import re import datetime s = I have a meeting on 2018-12-10 in New York match = re.sea
-
Pythonで区切り文字(str)を指定して文字列を分割する方法
Pythonで文字列を特定の区切り文字で分割する方法は、主に2つあります。1つは文字列クラスの組み込みメソッド split() を使う方法、もう1つは正規表現モジュール re の re.split() を使う方法です。それぞれの使い方を詳しく見ていきましょう。 split()メソッドで文字列を分割する PythonのStringクラスには split() というメソッドが用意されており、区切り文字をオプション引数として指定できます。引数を省略した場合、デフォルトの区切り文字は空白(ホワイトスペース)になります。 >>> aa-ab-ca.split(-) [aa, ab, c