概要(dir は「そのオブジェクトが持つ名前一覧」を教えてくれる内省の基本)
dir() は、オブジェクトが持つ属性名(メソッド、プロパティ、定数など)をリストで返す組み込み関数です。初めて触るモジュールやクラス、分からない値に出会ったとき「何ができる?」を一瞬で把握できます。引数なしで呼ぶと、現在のスコープ(その場で使える名前)を一覧します。
print(dir("hello")) # 文字列が持つメソッド名一覧('upper', 'strip' など)
print(dir()) # 今のスコープにある変数・関数・クラス名の一覧
Python基本の使い方(ここが重要)
オブジェクトの「持ち物」を一覧する
dir(obj) は obj が公開している属性名を文字列のリストで返します。名前が分かれば、help() や obj.名前 で詳細を掘り下げられます。
import math
names = dir(math)
print("sqrt" in names) # True → math.sqrt が使えると分かる
Python引数なしで「今その場の名前」を見る
dir() とだけ呼ぶと、現在のスコープ(ファイル先頭・関数内など)の名前一覧が返ります。デバッグや学習時の“見取り図”として有用です。
x = 10
def f(): pass
print(dir()) # ['__builtins__', 'f', 'x', ...]
Python先頭と末尾が __ の「マジック名」を見分ける
len や class のような“ダンダー(double underscore)”は特別用途の名前です。初心者は、まず通常メソッド(strip, upper など)から触り、必要に応じてマジックを学ぶと混乱しません。
s = "Tea"
print([n for n in dir(s) if not n.startswith("__")][:5]) # 代表的な通常メソッドを確認
Python使いこなしの勘所(深掘り)
dir は「一覧」であり「説明」ではない
dir は名前のリストしか返しません。何をするメソッドかは help() で確認します。dir → 気になる名前を選ぶ → help で詳細、の流れが最短ルートです。
import datetime as dt
print(dir(dt))
help(dt.datetime) # クラスの仕様・使い方を読む
Pythonクラスとインスタンスで結果が違うことがある
クラス(型)に生えているクラスメソッドや属性、インスタンスに生えているインスタンス属性で一覧が変わります。両方を dir して全体像を掴みましょう。
class Counter:
def __init__(self): self.n = 0
def inc(self): self.n += 1
print("class:", [n for n in dir(Counter) if not n.startswith("__")])
c = Counter()
print("instance:", [n for n in dir(c) if not n.startswith("__")])
Python隠し属性(アンダースコア)をフィルタして読みやすく
慣例的に、先頭が _ の名前は内部用です。学習初期はフィルタして“ユーザー向け”の名前に集中すると理解が早くなります。
import os
public = [n for n in dir(os) if not n.startswith("_")]
print(public[:10])
Python実務での活用(未知オブジェクトの理解・デバッグ・探索)
初見のモジュールを「地図化」する
使ったことのないモジュールは、dir で外観をつかみ、使えそうな名前に当たりを付けて help へ。公式ドキュメントへの到達もスムーズになります。
import pathlib
for n in dir(pathlib):
if "Path" in n:
print(n) # 'Path', 'PurePath', ...
Pythonデバッグで「今何が定義されているか」を確認
思った通りに名前が作られているか、上書きされていないかを dir() で即確認できます。特に関数内でのスコープの確認に役立ちます。
def demo():
temp = 123
print(dir()) # 関数ローカルの名前が見える
demo()
Pythonダックタイピングの事前チェック
「len が呼べる?」「append がある?」など、必要メソッドの有無を dir で事前確認してから処理する戦略は堅実です。
def head(xs):
names = dir(xs)
if "__len__" in names and "__getitem__" in names:
return xs[0] if len(xs) else None
raise TypeError("長さとインデックスアクセスを持つものを渡してください")
Python例題で身につける(定番から一歩先まで)
例題1:文字列の代表メソッドを探す
s = " Coffee "
methods = [n for n in dir(s) if not n.startswith("__")]
print("strip" in methods, "upper" in methods) # True True
print(s.strip().upper()) # 'COFFEE'
Python例題2:自作クラスの公開インターフェースを確認
class User:
def __init__(self, name): self.name = name
def greet(self): return f"Hello, {self.name}"
print([n for n in dir(User) if not n.startswith("_")]) # ['greet']
u = User("Hanako")
print([n for n in dir(u) if not n.startswith("_")]) # ['greet', 'name']
Python例題3:モジュールの名前を見て help につなぐ
import math
for n in ("sqrt", "pi"):
print(n, n in dir(math))
help(math.sqrt)
Python例題4:現在のスコープの確認で上書きミスを発見
sum = 0 # 組み込み関数名を上書きしてしまった…
print("sum" in dir()) # True → 上書きに気づける
del sum # 復旧
Pythonよくあるつまずきと対策
「dir はすべてを必ず返す」わけではない
getattr などの特殊挙動や動的生成を行うオブジェクトでは、dir に出ない属性が使えることもあります。最終的には実際に属性アクセスして try/except で確認するのが確実です。
def has_attr(obj, name):
try:
getattr(obj, name)
return True
except AttributeError:
return False
Pythonリストの中身は“名前文字列”であることに注意
dir が返すのは文字列です。実体が欲しいときは getattr(obj, “名前”) で取得します。dir → getattr のコンボを覚えると一気に扱いやすくなります。
import math
for name in ("sqrt", "cos"):
fn = getattr(math, name) # 実体を取得
print(name, fn(1))
Python使い方の詳細は help と公式ドキュメントで確認
名前が分かったら、help(対象) で引数や戻り値、注意点まで読み切るのがプロの習慣です。dir は入口、help は中身。セットで使うと迷いません。
まとめ
dir は「そのオブジェクトが何を提供するか」を一望するための内省ツールです。引数ありで“持ち物”一覧、引数なしで“その場の名前”一覧。名前は分かっても意味までは分からないので、help と合わせて使うのが最短距離。クラス/インスタンスでの違い、内部名のフィルタ、getattr との連携を押さえると、未知のオブジェクトへの“初動調査力”が一段上がります。迷ったらまず dir——そこから深掘りすれば、標準ライブラリも外部ライブラリも怖くなくなります。
