728x90
Python에서는 글로벌 변수를 사용할 수 있습니다. 특정 값을 여러 함수에서 공통으로 접근하거나 수정해야 할 때, global 키워드를 사용하여 가능합니다. 아래는 간단한 예제와 함께 설명해드릴게요.
1. 기본 예제: 글로벌 변수를 선언하고 함수에서 수정 및 호출
예제 코드:
# 글로벌 변수 선언
PEXELS_API_KEY = None # 초기값
# API 키를 로드하여 설정하는 함수
def load_api_key():
global PEXELS_API_KEY # 함수 내부에서 글로벌 변수 수정
PEXELS_API_KEY = "my_pexels_api_key_here"
# 메인 함수
def main():
print("Before loading API key:", PEXELS_API_KEY) # 로드 전 출력 (None)
load_api_key() # API 키 로드 및 설정
print("After loading API key:", PEXELS_API_KEY) # 로드 후 출력
# 실행
if __name__ == "__main__":
main()
실행 결과:
Before loading API key: None
After loading API key: my_pexels_api_key_here
2. 코드 동작 설명:
- 글로벌 변수 선언:
- PEXELS_API_KEY = None으로 선언하고, 초기값을 설정합니다.
- global 키워드 사용:
- 함수 내부에서 글로벌 변수를 수정하려면, 해당 함수에서 global PEXELS_API_KEY를 선언해야 합니다.
- 이를 통해 로컬 변수가 아니라 글로벌 변수를 참조하도록 만듭니다.
- 값 설정 후 다른 함수에서 사용:
- load_api_key 함수에서 값을 설정한 후, 메인 로직에서 동일한 변수를 사용합니다.
3. 추가 예제: 파일에서 API 키를 로드
load_api_key를 JSON 파일에서 값을 불러오는 방식으로 확장해볼 수 있습니다.
import json
import os
# 글로벌 변수 선언
PEXELS_API_KEY = None
# API 키를 JSON 파일에서 로드하는 함수
def load_api_key():
global PEXELS_API_KEY
config_path = os.path.join(os.path.dirname(__file__), 'config', 'api_key.json')
try:
with open(config_path, 'r') as file:
data = json.load(file)
PEXELS_API_KEY = data.get("PEXELS_API_KEY", None)
except FileNotFoundError:
print("Error: API key file not found.")
except json.JSONDecodeError:
print("Error: Failed to parse API key file.")
# 메인 함수
def main():
print("Before loading API key:", PEXELS_API_KEY)
load_api_key()
print("After loading API key:", PEXELS_API_KEY)
# 실행
if __name__ == "__main__":
main()
4. 주의할 점:
- 글로벌 변수는 최소화:
- 유지보수성과 코드 가독성을 위해, 글로벌 변수 사용은 최소화하는 것이 좋습니다.
- 필요하다면 클래스를 사용해 상태를 관리하거나, 함수를 통해 값을 전달하는 방식으로 대체할 수 있습니다.
- 쓰레드 안정성:
- 멀티쓰레드 환경에서는 글로벌 변수를 사용할 때 동기화 문제(값이 덮어씌워지거나 충돌)가 발생할 수 있습니다. 이 경우 threading.Lock 등을 사용해야 합니다.
- 전역 상태 관리:
- 복잡한 프로젝트에서는 글로벌 변수 대신 설정 파일이나 환경 변수를 사용하는 것이 더 좋습니다. (예: dotenv나 설정 클래스 활용)
또 다른 방법!
다른 파일에서 API 키를 로드하고 글로벌 변수에 설정한 뒤, 이를 메인 파일에서 호출해 사용하는 구조로 작성하려면 모듈화가 필요합니다. Python에서는 이를 모듈과 함수의 재사용으로 간단히 구현할 수 있습니다.
728x90
1. 프로젝트 구조
먼저 프로젝트의 디렉토리 구조를 정의해보겠습니다:
project/
├── config/
│ └── api_key.json
├── utils/
│ └── api_key_loader.py # API 키를 로드하고 설정하는 파일
└── main.py # 메인 파일
2. api_key_loader.py 작성
이 파일에서 API 키를 로드하고 글로벌 변수에 저장하는 모든 작업을 처리합니다.
코드: utils/api_key_loader.py
import json
import os
# 글로벌 변수 선언
PEXELS_API_KEY = None
# API 키를 JSON 파일에서 로드하는 함수
def load_api_key():
global PEXELS_API_KEY
config_path = os.path.join(os.path.dirname(__file__), '..', 'config', 'api_key.json')
try:
with open(config_path, 'r') as file:
data = json.load(file)
PEXELS_API_KEY = data.get("PEXELS_API_KEY", None)
except FileNotFoundError:
print("Error: API key file not found.")
except json.JSONDecodeError:
print("Error: Failed to parse API key file.")
# API 키를 반환하는 함수
def get_api_key():
return PEXELS_API_KEY
3. main.py 작성
메인 파일에서는 api_key_loader를 불러와 API 키를 로드하고 사용할 수 있습니다.
코드: main.py
from utils.api_key_loader import load_api_key, get_api_key
def main():
# API 키 로드
load_api_key()
# API 키 사용
api_key = get_api_key()
if api_key:
print("Loaded API Key:", api_key)
else:
print("API Key is not set.")
if __name__ == "__main__":
main()
4. 실행 순서
- load_api_key:
- main.py에서 load_api_key()를 호출하여 JSON 파일에서 API 키를 읽고 글로벌 변수에 저장합니다.
- get_api_key:
- API 키가 필요할 때 get_api_key()를 호출하여 값을 가져옵니다.
- 프로그램 실행:
python main.py
5. 실행 결과
config/api_key.json에 다음과 같은 내용이 있다고 가정합니다:
예시: config/api_key.json
{
"PEXELS_API_KEY": "my_pexels_api_key_here"
}
프로그램을 실행하면 다음 출력이 나타납니다:
Loaded API Key: my_pexels_api_key_here
6. 코드 동작 설명
- 모듈화:
- api_key_loader.py 파일은 API 키 로드와 글로벌 변수 설정만 처리하도록 분리되어 있습니다.
- 이를 통해 메인 파일(main.py)은 로직만 작성하고 세부 구현은 신경 쓰지 않아도 됩니다.
- 글로벌 변수 사용 제한:
- PEXELS_API_KEY는 api_key_loader 모듈 내부에서만 직접 수정되도록 제한되고, 외부에서는 get_api_key()로만 값을 가져오게 설계했습니다.
- 확장성:
- 여러 API 키를 로드하거나, 다른 환경에서 같은 코드를 사용할 때도 쉽게 확장할 수 있습니다.
7. 추가 팁
- 환경 변수와 함께 사용: 만약 .env 파일을 사용하는 방식으로 전환한다면, dotenv 모듈을 api_key_loader.py에 추가하면 됩니다.
- 에러 핸들링 개선: 예외 발생 시 더 상세한 로그를 출력하거나, 기본값을 설정할 수도 있습니다.
- 테스트: API 키 로드 및 사용을 테스트하려면 unittest를 활용해 테스트 케이스를 작성하는 것도 추천합니다.
728x90
'Python' 카테고리의 다른 글
[Python] 딕셔너리 사용하기 (5) | 2024.12.15 |
---|---|
[Python] 파일경로 불러오기 (절대경로,상대경로) (2) | 2024.12.14 |
[Python] FFmpeg API 사용하기 (0) | 2024.12.14 |
[Python] FFmpeg - 윈도우PC 폰트 불러오기 (2) | 2024.12.14 |
[Python] 문자열 처리방식 접두사 r, f (8) | 2024.12.10 |