programing

Python 3.8 이전에 괄호 없이 반환문에서 별표로 표시된 압축 풀기가 잘못된 구문인 이유는 무엇입니까?

easyjava 2023. 5. 4. 20:43
반응형

Python 3.8 이전에 괄호 없이 반환문에서 별표로 표시된 압축 풀기가 잘못된 구문인 이유는 무엇입니까?

Python 언어(특히 3.x)는 반복 가능한 매우 일반적인 언팩을 가능하게 합니다.

a, *rest = 1, 2, 3

수년에 걸쳐, 이 언팩은 점차 일반화되어(예: PEP 3132PEP 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

반응형