return 문에서 파이썬 튜플 풀기
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
일반적으로 이와 같은 코드가있을 때 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
'UFO ET IT' 카테고리의 다른 글
Node.js, Socket.io, Redis pub / sub 대용량, 낮은 지연 시간 (0) | 2020.11.18 |
---|---|
Interface Builder는 스토리 보드를 저하시키고, 뷰의 크기를 조정하고, 조금씩 위치를 변경합니다. (0) | 2020.11.18 |
괄호없이 Python 3 인쇄 (0) | 2020.11.18 |
Node.js로 실시간으로 웹 페이지 스크랩 (0) | 2020.11.18 |
Mac OSX에서 TortoiseSVN과 동등한 것은 무엇입니까? (0) | 2020.11.18 |