Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬에서 변수 존재 여부 확인하는 방법 – locals(), globals(), hasattr() 완벽 정리

개요

파이썬으로 개발하다 보면 특정 변수가 이미 정의되어 있는지 확인해야 하는 상황이 자주 발생합니다. 조건부로 선언된 변수를 사용하기 전에 존재 여부를 미리 검사하면 NameError 같은 런타임 오류를 예방할 수 있습니다. 파이썬에서는 내장 함수인 locals(), globals(), 그리고 hasattr()를 활용해 변수나 속성의 존재 여부를 손쉽게 확인할 수 있습니다.

변수 존재 여부를 확인하는 세 가지 방법

1. 지역 변수 확인 — locals()

locals() 함수는 현재 지역 스코프에 정의된 모든 변수를 딕셔너리 형태로 반환합니다. 따라서 '변수명' in locals() 구문을 사용하면 해당 이름이 지역 변수로 존재하는지 판별할 수 있습니다.

2. 전역 변수 확인 — globals()

globals() 함수는 모듈 수준의 전역 심볼 테이블을 딕셔너리로 반환합니다. 마찬가지로 '변수명' in globals() 구문으로 전역 변수의 존재 여부를 확인할 수 있습니다.

3. 객체 속성 확인 — hasattr()

hasattr(객체, '속성명')은 객체에 해당 속성이 존재하면 True, 존재하지 않으면 False를 반환합니다. 클래스 인스턴스의 멤버 변수나 메서드를 확인할 때 특히 유용합니다.

예제 코드

아래 예제는 위 세 가지 방법을 모두 사용해 변수와 속성의 존재 여부를 확인하는 과정을 보여줍니다.

x = 10

class foo:
g = 'rt'
def bar(self):
m = 6
print(locals())
if 'm' in locals():
print('m is local variable')
else:
print('m is not a local variable')

f = foo()
f.bar()
print(globals())
if hasattr(f, 'g'):
print('g is an attribute')
else:
print("g is not an attribute")
if 'x' in globals():
print('x is a global variable')

실행 결과

{'self': <__main__.foo instance at 0x0000000002E24EC8>, 'm': 6}
m is local variable
{'f': <__main__.foo instance at 0x0000000002E24EC8>, '__builtins__': <module '__builtin__' (built-in)>, '__file__': 'C:/Users/TutorialsPoint1/~.py', '__package__': None, 'x': 10, '__name__': '__main__', 'foo': <class __main__.foo at 0x0000000002D29828>, '__doc__': None}
g is an attribute
x is a global variable
Process finished with exit code 0

결과 해설

  • m is local variable: bar() 메서드 내부에서 locals()를 호출하면 selfm이 담긴 딕셔너리가 출력됩니다. 'm' in locals() 조건이 참이므로 m이 지역 변수임을 확인할 수 있습니다.
  • g is an attribute: hasattr(f, 'g')True를 반환하여, 인스턴스 f에 클래스 변수 g가 속성으로 존재함을 알 수 있습니다.
  • x is a global variable: 최상위 레벨에서 정의된 x = 10globals() 딕셔너리에 포함되어 있으므로 전역 변수로 확인됩니다.

참고: try-except를 이용한 대안

변수 존재 여부를 확인하는 또 다른 관용적인 방법은 try-except 블록을 사용하는 것입니다.

try:
x
print("x exists")
except NameError:
print("x does not exist")

이 방식은 EAFP(Easier to Ask Forgiveness than Permission) 스타일이라 불리며, 파이썬 커뮤니티에서 널리 권장되는 접근법입니다.

마무리

정리하면, 지역 변수는 locals(), 전역 변수는 globals(), 객체의 속성은 hasattr()로 각각 존재 여부를 확인할 수 있습니다. 상황에 맞는 적절한 방법을 선택하면 더 안전하고 오류 없는 코드를 작성할 수 있습니다.