Python / dir() / 객체의 메소드 등을 반환하는 함수
Python의 dir(object)는 객체에서 탐색할 수 있는 속성의 이름을 문자열 목록으로 반환합니다. 메서드 객체나 속성값 자체를 반환하거나 실행하는 기능은 아닙니다. 결과는 이름순으로 정렬되지만 객체가 목록을 정의할 수 있으므로 모든 실제 속성을 빠짐없이 보장하는 목록으로 해석하면 안 됩니다.
반환값은 메서드가 아닌 이름 목록입니다
속성은 객체에 연결된 데이터나 동작을 뜻하며, 메서드는 객체에 연결된 호출 가능한 동작입니다. 예를 들어 문자열의 upper는 메서드 이름이고 text.upper()가 실제 호출입니다. dir() 공식 문서는 대화형 탐색의 편의성을 위한 기능이라는 범위를 설명합니다.
예제는 Python 3만 있으면 실행할 수 있습니다. 전체 코드를 UTF-8의 dir_example.py로 저장하고 python dir_example.py로 실행합니다. 환경에 따라 python3을 사용하며, 뒤의 예제도 같은 파일 내용을 바꾸어 각각 실행할 수 있습니다.
text = "hello"
names = dir(text)
print(type(names).__name__)
print(all(isinstance(name, str) for name in names))
print("upper" in names)
print(names == sorted(names))
print(text.upper())
예상 결과는 다음과 같습니다.
list
True
True
True
HELLO
목록 원소는 모두 문자열이며, upper가 있다는 확인만으로 대문자 변환은 실행되지 않습니다. 마지막 줄에서 명시적으로 메서드를 호출해야 결과가 나옵니다. Python 버전에 따라 전체 속성 목록이 달라질 수 있어 여기서는 필요한 이름의 포함 여부를 확인합니다.
모듈과 리스트에서도 같은 방식으로 탐색합니다
모듈에는 함수·상수 등 여러 종류의 이름이 있습니다. dir(math)에서 찾은 sqrt는 math.sqrt()로 호출합니다. 리스트의 append도 이름을 찾은 뒤 객체에 직접 호출해야 리스트가 변경됩니다.
import math
print("sqrt" in dir(math))
print(math.sqrt(9))
items = []
print("append" in dir(items))
items.append("a")
print(items)
True
3.0
True
['a']
목록에 나타난 이름만으로 인수 형식이나 반환값을 알 수는 없습니다. 함수 사용법은 help(math.sqrt)나 해당 모듈의 공식 문서로 확인합니다. 이름 앞의 밑줄은 관례를 나타낼 수 있지만 외부에서 접근할 수 없도록 차단하는 보안 장치는 아닙니다.
dir()와 vars()는 확인하는 대상이 다릅니다
dir(instance)에는 인스턴스에 저장된 이름뿐 아니라 클래스와 상속 관계에서 얻는 이름도 포함될 수 있습니다. 반면 vars(object)는 객체의 __dict__를 반환합니다. 일반적인 인스턴스에서는 직접 저장된 속성과 값을 확인하는 데 유용하지만 모든 객체가 __dict__를 가지는 것은 아닙니다.
class User:
role = "reader"
def __init__(self, name):
self.name = name
def label(self):
return f"{self.role}:{self.name}"
user = User("Ada")
print([name for name in dir(user) if name in ("name", "role", "label")])
print(vars(user))
print(user.label())
['label', 'name', 'role']
{'name': 'Ada'}
reader:Ada
name은 인스턴스에 저장되고 role과 label은 클래스에서 가져오므로 두 결과가 다릅니다. 여기서 vars(user)는 복사본이 아니라 실제 속성 딕셔너리입니다. 탐색할 목적이라면 결과를 무심코 수정하지 않습니다. __slots__ 등으로 딕셔너리가 없는 객체에 vars()를 쓰면 TypeError가 발생할 수 있습니다.
인수를 생략하면 현재 이름 공간을 봅니다
dir()처럼 인수를 주지 않으면 현재 로컬 이름 공간의 이름을 반환합니다. 모든 내장 함수나 설치된 모든 패키지를 나열하는 기능은 아닙니다. 다음 코드를 독립된 새 파일에서 실행하면 직접 만든 marker는 있지만 내장 함수 abs는 목록에 직접 포함되지 않습니다.
marker = 7
print("marker" in dir())
print("abs" in dir())
True
False
이미 여러 이름을 만든 대화형 셸이나 노트북에서 실행하면 결과가 달라질 수 있습니다. 어느 위치에서 호출하는지와 이전 실행으로 남은 변수를 함께 확인합니다.
사용자 정의 __dir__()과 동적 속성의 한계
객체는 __dir__()로 탐색 목록을 정의하고 __getattr__() 등으로 속성을 동적으로 제공할 수 있습니다. 따라서 목록에서 이름이 빠져도 실제 접근이 가능할 수 있고, 반대로 표시된 이름을 읽으려 할 때 실패할 수도 있습니다.
class Dynamic:
def __getattr__(self, name):
if name == "answer":
return 42
raise AttributeError(name)
def __dir__(self):
return ["visible"]
item = Dynamic()
print(dir(item))
print("answer" in dir(item))
print(getattr(item, "answer"))
print(hasattr(item, "visible"))
['visible']
False
42
False
이 객체의 목록에는 visible만 있지만 실제로 제공하는 값은 answer입니다. dir()는 자동완성이나 학습 중 탐색에 활용하고, 필요한 동작의 지원 여부는 문서와 해당 속성의 동작을 확인합니다. getattr()·hasattr()는 속성 조회 코드를 실행할 수 있으며 dir()도 사용자 정의 메서드를 호출하므로 부작용이 전혀 없는 검사라고 가정하지 않습니다.




