UFO ET IT

return 문에서 파이썬 튜플 풀기

ufoet 2020. 11. 18. 21:50
반응형

return 문에서 파이썬 튜플 풀기


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

일반적으로 이와 같은 코드가있을 때 t임시 이름으로 간주 합니다.이 이름은 간단히 정리할 수 있어야합니다.이 이름 t은 그 정의로 맨 아래 줄을 바꾸는 것뿐입니다 . 이 경우 잘못된 코드가 발생합니다.

def f():
    rest = [2, 3]
    return 1, *rest

물론 반환 값을 괄호로 묶는 것은 큰 문제가 아니지만 일반적으로 몇 가지 가능한 결과 (그룹화)를 구별하기 위해 추가 괄호 만 필요합니다. 괄호를 생략하면 다른 원치 않는 동작이 발생하지 않고 전혀 동작하지 않기 때문에 이것은 사실이 아닙니다.


Python 3.2에 대한 이 커밋 의 의견에 따르면 이것이 사고라고 생각합니다 .

이 커밋은 할당 표현식이 testlist_star_expr생산 을 수행 할 수있게했지만 (괄호없는 압축 풀기를 허용하는) return 문이 testlist생산을 수행하도록 했습니다. 나는 커밋이 이것을 놓친 것 같습니다 (그리고 아마도 다른 위치이지만 return_stmt지금 프로덕션에 집중하고 있습니다).

나는 이것을 허용하기 위해 Python Grammar / Grammar 파일을 수정했습니다. test_grammar.py파일 에있는 테스트를 포함하여 모든 테스트가 계속 통과 합니다 (그러나 이것은 엄청나게 철저한 것 같지는 않습니다).

궁금하다면 이것이 제가 변경 한 것 입니다. 내 포크 를 복제하거나 다운로드하십시오 .

업데이트 : 나는 bpo 문제반환 (및 수율) 풀기 요청제출했습니다 .

참고 URL : https://stackoverflow.com/questions/47272460/python-tuple-unpacking-in-return-statement

반응형