Python | 関数:dir()

Python
スポンサーリンク

概要(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

先頭と末尾が __ の「マジック名」を見分ける

lenclass のような“ダンダー(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——そこから深掘りすれば、標準ライブラリも外部ライブラリも怖くなくなります。

タイトルとURLをコピーしました