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는 리스트, 집합, 딕셔너리 컴프리헨션과 제너레이터 표현식의 비동기 버전을 추가할 것을 제안합니다.
근거와 목표
Python은 동기 컴프리헨션을 폭넓게 지원하여, 간단하고 간결한 문법으로 리스트, 딕셔너리, 집합을 만들 수 있습니다. 비동기 코드에도 비슷한 문법 구조를 구현할 것을 제안합니다.
가독성이 얼마나 좋아지는지 보이기 위해 다음 예를 살펴보십시오:
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()).
비동기 컴프리헨션과 제너레이터 표현식에서는 async for를 if 및 for 절과 함께 사용할 수 있습니다:
dataset = {data for line in aiter()
async for data in line
if check(data)}
비동기 컴프리헨션은 async def 함수 안에서만 허용됩니다.
원칙적으로 비동기 제너레이터 표현식은 어떤 문맥에서든 허용됩니다. 하지만 Python 3.6에서는 async와 await가 소프트 키워드 지위를 갖기 때문에, 비동기 제너레이터 표현식은 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.