Python 3.8 이전에 괄호 없이 반환문에서 별표로 표시된 압축 풀기가 잘못된 구문인 이유는 무엇입니까?
Python 언어(특히 3.x)는 반복 가능한 매우 일반적인 언팩을 가능하게 합니다.
a, *rest = 1, 2, 3
수년에 걸쳐, 이 언팩은 점차 일반화되어(예: PEP 3132 및 PEP 448) 점점 더 많은 상황에서 사용될 수 있게 되었습니다.따라서 다음과 같은 구문이 Python 3.6(Python 3.7에서도 유효하지 않은 구문임을 알게 되어 놀랐습니다.)
def f():
rest = [2, 3]
return 1, *rest # Invalid
반환된 튜플을 다음과 같이 괄호 안에 캡슐화하여 작동시킬 수 있습니다.
def f():
rest = [2, 3]
return (1, *rest) # Valid
내가 이것을 사용한다는 것은return한 것처럼 .
t = 1, *rest
실제로 합법적이며 괄호가 있는 경우와 없는 경우가 동일합니다.
이 사례는 파이썬 개발자들에 의해 단순히 잊혀진 것입니까, 아니면 이 사례가 잘못된 구문인 이유가 있습니까?
내가 신경쓰는 이유
이것은 제가 파이썬 언어와 맺은 중요한 계약을 깨는 것입니다.다음과 같은 (유효한) 솔루션을 고려해 보십시오.
def f():
rest = [2, 3]
t = 1, *rest
return t
이런 는 보통제이코가드있지을때고, 생합다니각저는가런를▁consider▁like▁normally다▁i니생합각,▁i.t임시 이름이 되기 위해, 단순히 대체할 수 있어야 하는 것을 없앨 수 있어야 합니다.t그것의 정의와 함께 최종적으로.하지만 이 경우에는 잘못된 코드로 이어집니다.
def f():
rest = [2, 3]
return 1, *rest
물론 반환 값 주위에 괄호를 배치해야 하는 것은 큰 문제가 아니지만, 일반적으로 가능한 여러 결과(그룹화)를 구별하기 위해 추가 괄호만 필요합니다.괄호를 생략하면 다른 원치 않는 동작이 발생하지 않고 전혀 동작이 발생하지 않기 때문에 그렇지 않습니다.
갱신하다
Python 3.8(이 목록의 항목 7 참조) 이후로, 위에서 설명한 일반화된 구문은 이제 유효합니다.
Python 3.2에 대한 이 커밋의 의견을 토대로 볼 때, 저는 이것이 사고라고 생각합니다.
이 커밋을 통해 할당 표현식이 다음을 수행할 수 있습니다.testlist_star_expr생산(괄호화되지 않은 개봉을 허용하는 것), 그러나 반품 명세서를 남겼습니다.testlist생산.저는 위원회가 방금 이것을 놓쳤다고 의심합니다(그리고 아마도 다른 장소들), 하지만 저는 집중하고 있습니다.return_stmt현재 생산).
저는 이것을 허용하도록 Python Grammar/Grammar 파일을 수정했습니다.모든 시험은 계속해서 통과합니다. 시험을 포함해서요.test_grammar.py파일(그러나 이것은 끔찍하게 완전하지 않은 것으로 보입니다.).
궁금하시다면, 이것이 제가 만든 변화입니다.제 포크를 자유롭게 복제하거나 다운로드하세요.
업데이트: 반품(및 수율) 포장 해제를 위한 bpo 발행 및 풀 요청서를 제출했습니다.
언급URL : https://stackoverflow.com/questions/47272460/why-is-starred-iterable-unpacking-in-a-return-statement-invalid-syntax-without-p
'programing' 카테고리의 다른 글
| Objective-C에서 -init 메서드를 비공개로 할 수 있습니까? (0) | 2023.05.04 |
|---|---|
| 컨테이너에 있는 Azure blob 파일의 이름 목록을 가져오는 중? (0) | 2023.05.04 |
| Eclipse "서버 위치" 섹션이 비활성화되었으며 Tomcat 설치를 사용하려면 변경해야 합니다. (0) | 2023.05.04 |
| 수정 시 Git 커밋 작성자 날짜 업데이트 (0) | 2023.05.04 |
| index.ts는 모두 무엇에 사용됩니까? (0) | 2023.05.04 |