새소식

반응형
Programming Language/Python

[Python] 파이썬 dir() 함수

  • -
반응형

파이썬 로고 이미지입니다.
Python

파이썬 dir() 함수


dir() 함수는 파이썬 내장 함수 중 하나로, 객체의 속성(메서드, 변수 등) 목록을 반환한다. 이 함수는 어떤 객체에 대해 호출되면 해당 객체의 속성들을 리스트로 반환하며, 인자로 전달하지 않으면 현재 스코프(네임스페이스)의 속성 목록을 반환한다.

 

dir() 함수의 사용 목적

dir() 함수는 주로 아래와 같은 상황에서 사용하니 참고하기 바란다.

  • 객체의 속성 및 메서드 확인
    • 객체가 어떤 속성과 메서드를 가지고 있는지 확인할 때 사용된다. 특히, 외부 라이브러리나 모듈에서 가져온 객체의 구조를 이해하고자 할 때 유용하다.
  • 디버깅
    • 코드 디버깅 시에 객체의 내부를 살펴보는 데 활용될 수 있다. 특정 객체에 어떤 속성이 있는지 확인하고, 그 값을 확인하여 코드의 동작을 이해하는 데 도움이 된다.
  • 네임스페이스 확인
    • 현재 스코프에서 사용 가능한 변수, 함수 및 클래스를 확인할 때 사용된다. 전역 스코프나 모듈 스코프에서 현재 사용 가능한 모든 심벌을 확인할 수 있다.
  • 자동 완성 및 도움말 생성
    • 대화형 파이썬 셸이나 통합 개발 환경(IDE)에서 dir() 함수는 자동 완성 기능을 지원하거나 도움말을 생성하는 데 활용될 수 있다. 사용 가능한 속성이나 메서드 목록을 보여주어 개발자에게 도움이 된다.

 

📢 네임스페이스란 무엇인가?

네임스페이스(namespace)는 프로그래밍 언어에서 식별자(identifier)가 유효한 범위(scope) 또는 영역을 말한다. 간단하게 말하면, 변수나 함수, 클래스 등의 이름이 유효한 범위를 나타낸다. 네임스페이스는 이름 충돌을 방지하고 코드의 가독성을 높이는 데 도움이 된다.

 

파이썬에서는 globals() 및 locals() 함수를 사용하여 전역 및 지역 네임스페이스에 접근할 수 있다. 또한, dir() 함수를 사용하여 현재 스코프에서 사용 가능한 모든 심벌을 확인할 수 있다. 네임스페이스는 코드의 구조를 이해하고 변수의 범위를 파악하는 데 중요한 역할을 한다.

 

 

dir() 함수 사용 방법

지금까지 dir() 함수가 무엇인지에 대해 알아보았다, 정리하자면 dir() 함수는 객체의 속성(Attribute) 및 메서드(Method) 목록을 반환한다. 그렇다면 이제 어떻게 사용하는지 한 번 살펴보자.

 

import math

print(dir(math))
['__doc__', '__loader__', '__name__', '__package__','__spec__', 
 'acos', 'acosh', 'asin', 'asinh','atan', 'atan2', 'atanh', 
 'cbrt', 'ceil','comb', 'copysign', 'cos', 'cosh', 'degrees', 
 'dist', 'e', 'erf', 'erfc', 'exp', 'exp2', 'expm1', 'fabs', 
 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 
 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 
 'lcm', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 
 'nan', 'nextafter', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 
 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc', 'ulp']

math 모듈을 임포트 하고 해당 모듈의 네임스페이스를 확인하는 예제이다. 여기서 'acos', 'sin', 'pi' 등은 math 모듈에 정의된 함수 및 상수들을 나타낸다. 이를 통해 math 모듈이 어떤 함수와 상수를 제공하는지 알 수 있다.

 

class Person():

    def __init__(self,name:str = 'None', age:int = 0, job:str = 'None'):
        self.name = name
        self.age = age
        self.job = job
    
    def sleep(self):
        print(f'{self.name} is sleeping...')

    def eat(self, food:str = 'Bread'):
        print(f'{self.name} is eating {self.food}')

    def intro(self):
        print(f'Hello, world! I am {self.name}')

    def __str__(self) -> str:
        return f'{self.name}'
    
person = Person('Jack',29,'Data Engineer')
print(dir(person))
['__class__', '__delattr__', '__dict__', '__dir__', 
'__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__',
'__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', 
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', 
'__subclasshook__', '__weakref__', 'age', 'eat', 'intro', 
'job', 'name', 'sleep']

다른 예제로, 파이썬 클래스 Person을 정의하고, dir() 함수를 사용하여 해당 클래스의 객체에 대한 속성과 메서드를 나열한다. 

 

📢 dir() 함수가 객체의 메서드와 필드를 보여주는 기능을 하는 건 알겠는데, 매직 메서드 같은 경우 더블 언더바로 구분 할 수 있겠지만 어떤 게 일반 메서드이고 필드인지는 어떻게 구분할까?

 

dir() 함수의 결괏값에서 어떤 게 일반 메서드인지 필드인지 구분하기 위해선 파이썬에서 제공해 주는 collable() 함수를 활용하면 된다. 

person = Person('Jack',29,'Data Engineer')

# dir() 함수를 사용하여 객체의 속성과 메서드를 나열
attributes_and_methods = dir(person) 

# 필드와 메서드 구분하여 출력
fields = [attr for attr in attributes_and_methods if not callable(getattr(person, attr))]
methods = [attr for attr in attributes_and_methods if callable(getattr(person, attr))]

print("Fields : ", fields)
print()
print("Methods : ", methods)

collable 함수는 객체에서 특정 속성(attribute)이 호출 가능한(callable) 객체인지를 확인하는 표현식이다. 이 함수에 대해 좀 더 자세히 알아보자.

  1. getattr(person, attr) - getattr() 함수는 객체의 속성 값을 가져온다. 여기서 person은 위에서 만든 객체이고, attr은 속성의 이름이다.  따라서, 이 부분은 person 객체의 attr 속성에 해당하는 값을 반환한다.
  2. callable(...) - callable() 함수는 주어진 객체가 호출 가능한지를 확인한다. 함수 또는 메서드와 같이 호출할 수 있는 객체인 경우 True를 반환하고, 그렇지 않으면 False를 반환한다.

따라서, callable(getattr(person, attr))는 person 객체에서 attr이라는 속성의 값이 호출 가능한 객체인지를 확인하는 것이다. 이를 통해 속성이 함수(메서드)인지를 판별하고, 이를 이용하여 필드와 메서드를 구분할 수 있다.

Fields :  ['__dict__', '__doc__', '__module__', '__weakref__', 'age', 'job', 'name']

Methods :  ['__class__', '__delattr__', '__dir__', '__eq__', '__format__', '__ge__',
'__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__',
'__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', 
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'eat', 'intro', 'sleep']

실행 결과

 

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.