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
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
PEP 492와 PEP 525는 async/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에서는 async와 await가 소프트 키워드(soft-keyword) 상태이기 때문에, 비동기 제너레이터 표현식은 async def 함수 내부에서만 허용됩니다. Python 3.7에서 async와 await가 예약 키워드가 되면 이 제약은 사라질 것입니다.
컴프리헨션에서의 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 인자를 갖게 될 것입니다.
하위 호환성
이 제안은 완전히 하위 호환됩니다.
승인
구현
구현은 이슈 28008 [3]에서 추적되고 있습니다. 참조 구현 git 저장소는 [2]에서 이용할 수 있습니다.
참고 자료
감사의 말
이 PEP에 대한 피드백, 코드 리뷰, 논의를 해준 Guido van Rossum, Victor Stinner, Elvis Pranskevichus에게 감사드립니다.
Copyright
This document has been placed in the public domain.