Pythonのrepr()関数を徹底解説!開発者向けオブジェクト表現の理解
Pythonでプログラミングをしていると、オブジェクトのデバッグやログ出力の際に、そのオブジェクトが「どのような状態であるか」を正確に知りたい場合があります。特に、開発者としてオブジェクトの詳細な情報や、それを再構築するために必要な表現を見たいときに役立つのが、Pythonの組み込み関数である**repr()関数**です。この記事では、repr()関数の基本的な使い方から、その役割、str()関数との違い、そして具体的な活用事例までを初心者にもわかりやすく解説しますします。
repr()関数とは?開発者のための「公式な」表現
Pythonのrepr()関数は、引数として渡されたオブジェクトの**「公式な文字列表現(canonical string representation)」**を返す組み込み関数です。この表現は、主に開発者向けに設計されており、以下の特性を持つことが期待されます。
-
曖昧さがないこと: そのオブジェクトを一意に識別できるような情報が含まれていること。
-
再構築可能であること: 可能であれば、その表現を
eval()関数に渡すと、元のオブジェクトと等価なオブジェクトを再構築できるような文字列であること。 -
詳細であること: デバッグに役立つ十分な情報が含まれていること。
基本的な使い方
repr()関数は、1つの引数を取ります。
# 整数の表現
my_int = 123
print(f"整数のrepr(): {repr(my_int)}") # 出力: 整数のrepr(): 123
# 文字列の表現 (引用符が含まれる)
my_string = "Hello Python"
print(f"文字列のrepr(): {repr(my_string)}") # 出力: 文字列のrepr(): 'Hello Python'
# リストの表現
my_list = [1, 'a', [2, 3]]
print(f"リストのrepr(): {repr(my_list)}") # 出力: リストのrepr(): [1, 'a', [2, 3]]
# カスタムクラスの表現 (デフォルト)
class MyClass:
def __init__(self, value):
self.value = value
obj = MyClass(100)
print(f"カスタムクラスのrepr() (デフォルト): {repr(obj)}")
# 出力例: カスタムクラスのrepr() (デフォルト): <__main__.MyClass object at 0x...>
# (デフォルトでは、オブジェクトの型とメモリアドレスが表示されることが多い)
repr()関数とstr()関数の違い:目的の明確化
Pythonには、オブジェクトを文字列に変換するもう一つの組み込み関数**str()関数があります。これら二つの関数は似ていますが、その目的と対象読者**が異なります。
| 特徴 | repr(object) |
str(object) |
| 目的 | 開発者向けの「公式な」表現 | ユーザー(エンドユーザー)向けの「読みやすい」表現 |
| 情報量 | 曖昧さがなく、再構築可能な詳細な情報 | 人間が理解しやすい簡潔な情報 |
| 使用例 | デバッグ、ログ出力、オブジェクトの検査 | print()関数、ユーザーへのメッセージ表示、GUI要素 |
| 対応Dunder | オブジェクトのクラスに**__repr__()**メソッドが定義されている場合に呼び出される |
オブジェクトのクラスに**__str__()**メソッドが定義されている場合に呼び出される |
比較例
import datetime
# datetimeオブジェクトの例
now = datetime.datetime.now()
print(f"datetimeのstr(): {str(now)}") # 出力: datetimeのstr(): 2025-08-01 12:49:55.123456 (例)
print(f"datetimeのrepr(): {repr(now)}") # 出力: datetimeのrepr(): datetime.datetime(2025, 8, 1, 12, 49, 55, 123456) (例)
# カスタムクラスで__repr__と__str__を定義
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
# ユーザー向けに読みやすく表示
return f"({self.x}, {self.y})"
def __repr__(self):
# 開発者向けに詳細かつ再構築可能な形式で表示
return f"Point(x={self.x}, y={self.y})"
p = Point(10, 20)
print(f"Pointのstr(): {str(p)}") # 出力: Pointのstr(): (10, 20)
print(f"Pointのrepr(): {repr(p)}") # 出力: Pointのrepr(): Point(x=10, y=20)
# print()関数はデフォルトでstr()を呼び出す
print(p) # 出力: (10, 20)
この例からわかるように、repr()はオブジェクトを再構築するための情報(Point(x=10, y=20))を提供し、str()は人間が直感的に理解しやすい形式((10, 20))を提供します。print()関数は、通常str()によって返される値を表示します。
__repr__()メソッドのカスタマイズ
カスタムクラスでrepr()が返す文字列を制御するには、クラス内に特殊メソッド**__repr__()**を定義します。これは、開発者にとってオブジェクトの状態を理解しやすくするために非常に重要です。
class Book:
def __init__(self, title, author, year):
self.title = title
self.author = author
self.year = year
def __repr__(self):
# この表現からオブジェクトを再構築できるような形式が理想
return f"Book(title='{self.title}', author='{self.author}', year={self.year})"
# __str__も定義すると、print()やstr()の挙動が変わる
def __str__(self):
return f"「{self.title}」by {self.author} ({self.year})"
my_book = Book("Python入門", "山田太郎", 2023)
print(f"repr(my_book): {repr(my_book)}")
# 出力: repr(my_book): Book(title='Python入門', author='山田太郎', year=2023)
print(f"str(my_book): {str(my_book)}")
# 出力: str(my_book): 「Python入門」by 山田太郎 (2023)
print(my_book) # print()はstr()を呼び出す
# 出力: 「Python入門」by 山田太郎 (2023)
repr()関数の活用事例
repr()関数は、主に以下のシナリオでその真価を発揮します。
1. デバッグ
デバッガでオブジェクトの中身を確認したり、一時的に変数の値をプリントして状態を把握したりする際に、repr()の出力は非常に有用です。特に複雑なデータ構造を持つオブジェクトの場合、その内部状態が詳細に表示されることで問題の特定に役立ちます。
# 複雑なオブジェクトのデバッグ
class UserSession:
def __init__(self, user_id, last_login_time, active_flags):
self.user_id = user_id
self.last_login_time = last_login_time
self.active_flags = active_flags
def __repr__(self):
return (f"UserSession(user_id={self.user_id!r}, " # !rで再帰的にrepr()を呼び出す
f"last_login_time={self.last_login_time!r}, "
f"active_flags={self.active_flags!r})")
session = UserSession(123, datetime.datetime.now(), {"admin": True, "premium": False})
print(f"セッションオブジェクトのrepr(): {repr(session)}")
# 出力例: セッションオブジェクトのrepr(): UserSession(user_id=123, last_login_time=datetime.datetime(2025, 8, 1, 12, 49, 55, 123456), active_flags={'admin': True, 'premium': False})
F-string内の!r書式指定は、埋め込む変数をrepr()で処理してから文字列に変換することを意味し、デバッグ出力で非常に便利です。
2. ロギング
システムで発生したイベントやオブジェクトの状態をログファイルに出力する際に、repr()を使用してオブジェクトの詳細な情報を記録することで、後から問題の原因を追跡しやすくなります。
import logging
logging.basicConfig(level=logging.INFO)
class Transaction:
def __init__(self, id, amount, status):
self.id = id
self.amount = amount
self.status = status
def __repr__(self):
return f"Transaction(id='{self.id}', amount={self.amount}, status='{self.status}')"
transaction = Transaction("TX001", 1500.50, "pending")
logging.info(f"新しいトランザクションが作成されました: {transaction!r}")
# ログ出力例: INFO:root:新しいトランザクションが作成されました: Transaction(id='TX001', amount=1500.5, status='pending')
3. オブジェクトのシリアライズ・デシリアライズ(限定的)
厳密にはシリアライズの主要な手段ではありませんが、単純なオブジェクトであればrepr()の出力とeval()を組み合わせてオブジェクトを「再構築」することが可能です。ただし、これはセキュリティリスクを伴うため、信頼できるソースからのデータにのみ適用すべきです。
# p = Point(10, 20)
# p_repr = repr(p) # "Point(x=10, y=20)"
# restored_p = eval(p_repr) # eval()で文字列からオブジェクトを再構築
# print(restored_p) # (10, 20)
# print(type(restored_p)) # <class '__main__.Point'>
eval()の使用は、外部からの信頼できない入力を処理する場合には絶対避けるべきです。
まとめ
Pythonのrepr()関数は、オブジェクトの「公式な」かつ「開発者向け」の文字列表現を返す組み込み関数です。これは、デバッグやロギングの際にオブジェクトの詳細な状態を正確に把握するために非常に重要です。str()関数がユーザー向けの「読みやすい」表現であるのに対し、repr()は再構築可能で曖昧さのない詳細な表現を提供することを目的としています。カスタムクラスでは、__repr__()メソッドを定義することで、この表現をカスタマイズできます。
-
repr(object): オブジェクトの開発者向けの文字列表現を返します。 -
str()関数とは異なり、曖昧さがなく、再構築可能であることが理想とされます。 -
クラスに**
__repr__()メソッド**を定義することで、カスタムクラスのrepr()出力を制御できます。 -
主にデバッグ、ロギング、オブジェクトの検査といった場面で活用されます。
この関数を理解し適切に活用することで、Pythonコードのデバッグ効率が向上し、より信頼性の高いシステムを構築できるようになるでしょう。
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座

