Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

PEP 530 – 비동기 컴프리헨션

Author:
Yury Selivanov <yury at edgedb.com>
Discussions-To:
Python-Dev list
Status:
Final
Type:
Standards Track
Created:
03-Sep-2016
Python-Version:
3.6
Post-History:
03-Sep-2016

Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

초록

PEP 492PEP 525async/await 구문을 사용하는 네이티브 코루틴과 비동기 제너레이터에 대한 지원을 도입합니다. 이 PEP는 리스트, 세트, 딕셔너리 컴프리헨션과 제너레이터 표현식의 비동기 버전을 추가할 것을 제안합니다.

근거와 목표

파이썬은 동기 컴프리헨션에 대해 광범위한 지원을 제공하여, 간단하고 간결한 구문으로 리스트, 딕셔너리, 세트를 생성할 수 있게 합니다. 저희는 비동기 코드에 대해서도 유사한 구문적 구성을 구현할 것을 제안합니다.

가독성 개선을 보여주기 위해 다음 예제를 살펴보겠습니다.:

result = []
async for i in aiter():
    if i % 2:
        result.append(i)

제안된 비동기 컴프리헨션 구문을 사용하면, 위 코드는 다음과 같이 짧아집니다.:

result = [i async for i in aiter() if i % 2]

이 PEP는 또한 모든 종류의 컴프리헨션에서 await 표현식을 사용할 수 있게 합니다.:

result = [await fun() for fun in funcs]

명세

비동기 컴프리헨션

저희는 리스트, 세트, 딕셔너리 컴프리헨션 내부에서 async for를 사용할 수 있도록 허용할 것을 제안합니다. 또한 PEP 525의 승인이 있으면 비동기 제너레이터 표현식의 생성도 허용할 수 있습니다.

예제:

  • 세트 컴프리헨션: {i async for i in agen()};
  • 리스트 컴프리헨션: [i async for i in agen()];
  • 딕셔너리 컴프리헨션: {i: i ** 2 async for i in agen()};
  • 제너레이터 표현식: (i ** 2 async for i in agen()).

비동기 컴프리헨션과 제너레이터 표현식에서 if절 및 for절과 함께 async for를 사용하는 것이 허용됩니다.:

dataset = {data for line in aiter()
                async for data in line
                if check(data)}

비동기 컴프리헨션은 async def 함수 내부에서만 허용됩니다.

원칙적으로 비동기 제너레이터 표현식은 모든 컨텍스트에서 허용됩니다. 그러나 Python 3.6에서는 asyncawait가 소프트 키워드(soft-keyword) 상태이기 때문에, 비동기 제너레이터 표현식은 async def 함수 내부에서만 허용됩니다. Python 3.7에서 asyncawait가 예약 키워드가 되면 이 제약은 사라질 것입니다.

컴프리헨션에서의 await

비동기 컴프리헨션과 동기 컴프리헨션 모두에서 await 표현식의 사용을 허용할 것을 제안합니다.:

result = [await fun() for fun in funcs]
result = {await fun() for fun in funcs}
result = {fun: await fun() for fun in funcs}

result = [await fun() for fun in funcs if await smth]
result = {await fun() for fun in funcs if await smth}
result = {fun: await fun() for fun in funcs if await smth}

result = [await fun() async for fun in funcs]
result = {await fun() async for fun in funcs}
result = {fun: await fun() async for fun in funcs}

result = [await fun() async for fun in funcs if await smth]
result = {await fun() async for fun in funcs if await smth}
result = {fun: await fun() async for fun in funcs if await smth}

이는 async def 함수 본문 내에서만 유효합니다.

문법 갱신 사항

이 제안은 문법 수준에서 한 가지 변경, 즉 comp_for에 선택적 “async” 키워드를 추가하는 것을 필요로 합니다.:

comp_for: [ASYNC] 'for' exprlist 'in' or_test [comp_iter]

comprehension AST 노드는 새로운 is_async 인자를 갖게 될 것입니다.

하위 호환성

이 제안은 완전히 하위 호환됩니다.

승인

PEP 530은 2016년 9월 6일 Guido에 의해 승인되었습니다 [1].

구현

구현은 이슈 28008 [3]에서 추적되고 있습니다. 참조 구현 git 저장소는 [2]에서 이용할 수 있습니다.

참고 자료

감사의 말

이 PEP에 대한 피드백, 코드 리뷰, 논의를 해준 Guido van Rossum, Victor Stinner, Elvis Pranskevichus에게 감사드립니다.