Python

[Python] 전역변수 사용하기 (global 변수)

IronAreum 2024. 12. 14. 22:40
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. 코드 동작 설명:

  1. 글로벌 변수 선언:
    • PEXELS_API_KEY = None으로 선언하고, 초기값을 설정합니다.
  2. global 키워드 사용:
    • 함수 내부에서 글로벌 변수를 수정하려면, 해당 함수에서 global PEXELS_API_KEY를 선언해야 합니다.
    • 이를 통해 로컬 변수가 아니라 글로벌 변수를 참조하도록 만듭니다.
  3. 값 설정 후 다른 함수에서 사용:
    • 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. 주의할 점:

  1. 글로벌 변수는 최소화:
    • 유지보수성과 코드 가독성을 위해, 글로벌 변수 사용은 최소화하는 것이 좋습니다.
    • 필요하다면 클래스를 사용해 상태를 관리하거나, 함수를 통해 값을 전달하는 방식으로 대체할 수 있습니다.
  2. 쓰레드 안정성:
    • 멀티쓰레드 환경에서는 글로벌 변수를 사용할 때 동기화 문제(값이 덮어씌워지거나 충돌)가 발생할 수 있습니다. 이 경우 threading.Lock 등을 사용해야 합니다.
  3. 전역 상태 관리:
    • 복잡한 프로젝트에서는 글로벌 변수 대신 설정 파일이나 환경 변수를 사용하는 것이 더 좋습니다. (예: 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. 실행 순서

  1. load_api_key:
    • main.py에서 load_api_key()를 호출하여 JSON 파일에서 API 키를 읽고 글로벌 변수에 저장합니다.
  2. get_api_key:
    • API 키가 필요할 때 get_api_key()를 호출하여 값을 가져옵니다.
  3. 프로그램 실행:
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. 코드 동작 설명

  1. 모듈화:
    • api_key_loader.py 파일은 API 키 로드와 글로벌 변수 설정만 처리하도록 분리되어 있습니다.
    • 이를 통해 메인 파일(main.py)은 로직만 작성하고 세부 구현은 신경 쓰지 않아도 됩니다.
  2. 글로벌 변수 사용 제한:
    • PEXELS_API_KEY는 api_key_loader 모듈 내부에서만 직접 수정되도록 제한되고, 외부에서는 get_api_key()로만 값을 가져오게 설계했습니다.
  3. 확장성:
    • 여러 API 키를 로드하거나, 다른 환경에서 같은 코드를 사용할 때도 쉽게 확장할 수 있습니다.

7. 추가 팁

  • 환경 변수와 함께 사용: 만약 .env 파일을 사용하는 방식으로 전환한다면, dotenv 모듈을 api_key_loader.py에 추가하면 됩니다.
  • 에러 핸들링 개선: 예외 발생 시 더 상세한 로그를 출력하거나, 기본값을 설정할 수도 있습니다.
  • 테스트: API 키 로드 및 사용을 테스트하려면 unittest를 활용해 테스트 케이스를 작성하는 것도 추천합니다.

 

 

728x90