개요
파이썬으로 개발하다 보면 특정 변수가 이미 정의되어 있는지 확인해야 하는 상황이 자주 발생합니다. 조건부로 선언된 변수를 사용하기 전에 존재 여부를 미리 검사하면 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()를 호출하면self와m이 담긴 딕셔너리가 출력됩니다.'m' in locals()조건이 참이므로m이 지역 변수임을 확인할 수 있습니다. - g is an attribute:
hasattr(f, 'g')가True를 반환하여, 인스턴스f에 클래스 변수g가 속성으로 존재함을 알 수 있습니다. - x is a global variable: 최상위 레벨에서 정의된
x = 10이globals()딕셔너리에 포함되어 있으므로 전역 변수로 확인됩니다.
참고: 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()로 각각 존재 여부를 확인할 수 있습니다. 상황에 맞는 적절한 방법을 선택하면 더 안전하고 오류 없는 코드를 작성할 수 있습니다.