제퍼넷 로고

Python 컨텍스트 관리자의 3가지 흥미로운 용도 - KDnuggets

시간

Python 컨텍스트 관리자의 3가지 흥미로운 용도
이미지: Johnstocker Freepik
 

얼마전에 튜토리얼을 쓴 적이 있는데 효율적인 Python 코드 작성. 여기에서는 리소스를 효율적으로 관리하기 위해 컨텍스트 관리자와 with 문을 사용하는 방법에 대해 이야기했습니다.

예외가 발생하더라도 실행이 with 블록을 종료할 때 파일이 자동으로 닫히는 방법을 보여주기 위해 간단한 파일 처리 예제를 사용했습니다.

파일 처리는 좋은 첫 번째 예이지만 금방 지루해질 수 있습니다. 이것이 바로 이 튜토리얼에서 파일 처리를 넘어서 컨텍스트 관리자의 다른 흥미로운 사용법을 살펴보고 싶은 이유입니다. 우리는 데이터베이스 연결 처리, 하위 프로세스 관리 및 고정밀 부동 소수점 연산에 중점을 둘 것입니다.

Python의 컨텍스트 관리자를 사용하면 리소스 작업 시 더 깔끔한 코드를 작성할 수 있습니다. 다음을 통해 리소스를 설정하고 해제하는 간결한 구문을 제공합니다.

  • An 입력 실행이 컨텍스트에 들어갈 때 호출되는 논리
  • An 출구 실행이 컨텍스트를 종료할 때 호출되는 논리 

이에 대한 가장 간단한 예는 파일 처리입니다. 여기서 우리는 open() 기능의 with 파일 핸들러를 가져오는 명령문:

with open('filename.txt', 'w') as file:
    file.write('Something random')

 

이는 코드 블록 내에서 사용되는(파일에 쓰는) 리소스(파일 객체)를 획득합니다. 실행이 컨텍스트를 종료하면 파일이 닫힙니다. 따라서 리소스 누출이 없습니다.

다음과 같이 일반 버전을 작성할 수 있습니다.

with some_context() as ctx:
    # do something useful on the resource!

# resource cleanup is automatic

 

이제 구체적인 사례를 살펴보겠습니다.

Python 애플리케이션을 구축할 때 데이터베이스에 연결하고 데이터베이스에 포함된 테이블을 쿼리하는 것은 매우 일반적입니다. 이를 수행하는 워크플로는 다음과 같습니다.

  • 데이터베이스 작업을 위해 데이터베이스 커넥터를 설치합니다(예: Postgres용 psycopg2 및 MySQL 데이터베이스용 mysql-connector-python).
  • 구성 파일을 구문 분석하여 연결 매개변수를 검색합니다. 
  • 사용 connect() 데이터베이스에 대한 연결을 설정하는 기능입니다.

 

Python 컨텍스트 관리자의 3가지 흥미로운 용도
DB에 연결 | 작성자별 이미지
 

데이터베이스에 연결한 후에는 데이터베이스를 생성하여 데이터베이스를 쿼리할 수 있습니다. 실행 및 가져오기 커서 메서드를 사용하여 쿼리를 실행하고 쿼리 결과를 가져옵니다.

 

Python 컨텍스트 관리자의 3가지 흥미로운 용도
DB 쿼리 | 작성자별 이미지
 

이를 통해 데이터베이스 연결 및 데이터베이스 커서와 같은 리소스를 생성합니다. 이제 연결 및 커서 개체를 컨텍스트 관리자로 사용하는 방법을 알아보기 위해 간단한 일반 예제를 코딩해 보겠습니다.

Python에서 TOML 파일 구문 분석

데이터베이스에 연결하는 데 필요한 정보가 포함된 샘플 TOML 파일(예: db_config.toml)을 고려해 보세요.

# db_config.toml

[database]
host = "localhost"
port = 5432
database_name = "your_database_name"
user = "your_username"
password = "your_password"

 

주의 사항: 사용하려면 Python 3.11 이상의 버전이 필요합니다. tomllib.

 

파이썬에는 내장된 tomllib TOML 파일을 구문 분석할 수 있는 모듈(Python 3.11에 도입됨)입니다. 따라서 db_config.toml 파일을 열고 다음과 같이 내용을 구문 분석할 수 있습니다.

import tomllib

with open('db_config.toml','rb') as file:
	credentials = tomllib.load(file)['database']

 

db_config.toml 파일의 'database' 섹션을 탭합니다. 그만큼 load() 함수는 Python 사전을 반환합니다. 내용을 인쇄하여 확인할 수 있습니다. credentials:

print(credentials)

 

Output >>>
{'host': 'localhost', 'port': 5432, 'database_name': 'your_database_name', 'user': 'your_username', 'password': 'your_password'}

데이터베이스에 연결

Postgres 데이터베이스에 연결하고 싶다고 가정해 보겠습니다. 당신은 설치할 수 있습니다 psycopg2 커넥터 핍 사용:

pip install psycopg2

 

다음과 같이 with 문에서 연결과 커서 개체를 모두 사용할 수 있습니다.

import psycopg2

# Connect to the database
with psycopg2.connect(**credentials) as conn:
	# Inside this context, the connection is open and managed

	with conn.cursor() as cur:
    	# Inside this context, the cursor is open and managed

    	cur.execute('SELECT * FROM my_table')
    	result = cur.fetchall()
            print(result)

 

이 코드에서 :

  • 우리는을 사용하여 with 데이터베이스 연결을 관리하기 위한 컨텍스트를 생성하는 명령문입니다. 
  • 이 컨텍스트 내에서 데이터베이스 커서를 관리하기 위한 또 다른 컨텍스트를 만듭니다. 이 내부 컨텍스트를 종료하면 커서가 자동으로 닫힙니다.
  • 외부 컨텍스트를 종료할 때 연결도 닫히기 때문에 이 구성은 연결과 커서가 모두 적절하게 관리되도록 보장하여 리소스 누출 가능성을 줄입니다.

SQLite 및 MySQL 데이터베이스로 작업할 때도 비슷한 구성을 사용할 수 있습니다.

Python의 하위 프로세스 모듈은 Python 스크립트 내에서 외부 명령을 실행하는 기능을 제공합니다. 그만큼 subprocess.Popen() 생성자는 새로운 하위 프로세스를 생성합니다. 다음에서 사용할 수 있습니다. with 다음과 같은 진술:

import subprocess

# Run an external command and capture its output
with subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, text=True) as process:
	output, _ = process.communicate()
	print(output)

 

여기서는 Bash 명령을 실행합니다. ls -l 현재 디렉토리의 파일을 길게 나열하는 명령:

Output >>>

total 4
-rw-rw-r-- 1 balapriya balapriya   0 Jan  5 18:31 db_info.toml
-rw-rw-r-- 1 balapriya balapriya 267 Jan  5 18:32 main.py

 

실행이 컨텍스트를 종료하면 하위 프로세스와 관련된 리소스가 해제됩니다. with 성명서. 

Python에 내장된 부동 소수점 데이터 유형은 고정밀 부동 소수점 연산에 적합하지 않습니다. 그러나 금융 데이터, 센서 판독값 등을 다룰 때는 높은 정밀도가 필요합니다. 이러한 애플리케이션의 경우 다음을 사용할 수 있습니다. 소수 대신 모듈. 

XNUMXD덴탈의 localcontext() 기능 컨텍스트 관리자를 반환합니다.. 그래서 당신은 localcontext() 기능의 with 명령문을 작성하고 다음과 같이 현재 컨텍스트의 정밀도를 설정하십시오.

from decimal import Decimal, localcontext

with localcontext() as cur_context:
    cur_context.prec = 40
    a = Decimal(2)
    b = Decimal(3)
    print(a/b)

 

출력은 다음과 같습니다.

Output >>>
0.6666666666666666666666666666666666666667

 

여기서 정밀도는 소수점 이하 40자리로 설정되어 있습니다. with 차단하다. 실행이 현재 컨텍스트를 종료하면 정밀도가 기본 정밀도(소수점 28자리)로 복원됩니다.

이 튜토리얼에서는 컨텍스트 관리자를 사용하여 데이터베이스 연결을 처리하고 고정밀 부동 소수점 연산에서 하위 프로세스 및 컨텍스트를 관리하는 방법을 배웠습니다.

다음 튜토리얼에서는 Python에서 사용자 정의 컨텍스트 관리자를 만드는 방법을 살펴보겠습니다. 그때까지 즐거운 코딩하세요!
 
 

발라 프리야 C 인도 출신의 개발자이자 테크니컬 라이터입니다. 그녀는 수학, 프로그래밍, 데이터 과학 및 콘텐츠 제작의 교차점에서 일하는 것을 좋아합니다. 그녀의 관심 분야와 전문 분야는 DevOps, 데이터 과학 및 자연어 처리입니다. 그녀는 읽기, 쓰기, 코딩, 커피를 즐깁니다! 현재 그녀는 자습서, 사용 방법 가이드, 의견 등을 작성하여 개발자 커뮤니티와 지식을 배우고 공유하는 작업을 하고 있습니다.

spot_img

최신 인텔리전스

spot_img