이 이상한 결장 행동은 무엇을하고 있습니까?


104

저는 Python 3.6.1을 사용하고 있는데 매우 이상한 것을 발견했습니다. 검색하는 데 오랜 시간이 걸리는 간단한 사전 할당 오타가 있습니다.

context = {}
context["a"]: 2
print(context)

산출

{}

코드는 무엇을 context["a"]: 2하고 있습니까? SyntaxErrorIMO가 필요한 경우를 제기하지 않습니다 . 처음에는 슬라이스를 만들고 있다고 생각했습니다. 그러나 입력 repr(context["a"]: 2)하면 SyntaxError. 나는 또한 context["a"]: 2콘솔에 입력 했지만 콘솔은 아무것도 인쇄하지 않았습니다. 나는 그것이 돌아 왔을지도 모른다고 생각 None했지만 나는 그렇게 확신하지 않는다.

또한 한 줄의 if 문이 될 수 있다고 생각했지만 올바른 구문이 아니어야합니다.

또한, context["a"]를 제기한다 KeyError.

나는 당황합니다. 무슨 일이야?


2
이미이 질문은 속이고 파이썬 초보자에게는 혼란 스럽습니다. 일반적으로 초기화 전 유형 힌트와 변수 정의가 외국어라고 느낄 수있는 유일한 언어 인 경우 이것이 최악이라고 생각합니다. 이 동작은 PEP 526에 설명 된대로 의도적이고 때로는 유용하기 때문에 오류를 발생시키는 것은 불가능하다고 생각하며 호환성을 깨고 싶지 않습니다. 그러나 Python 개발자가 경우에 따라 유용한 경고 메시지를 추가하는 것을 고려할 것인지 궁금합니다.
Chris_Rands

1
이것이 귀하의 질문에 대답합니까? Python 3.6의 변수 주석은 무엇입니까?
Georgy

답변:


98

실수로 구문 상 올바른 변수 주석을 작성했습니다 . 이 기능은 Python 3.6에서 도입되었습니다 ( PEP 526 참조 ).

변수 주석은 주석이 달린 할당의 일부로 구문 분석되지만 할당 문은 선택 사항입니다 .

annotated_assignment_stmt ::=  augtarget ":" expression ["=" expression]

따라서 context["a"]: 2

  • context["a"] 주석 대상입니다.
  • 2 주석 그 자체입니다
  • context["a"] 초기화되지 않은 상태로 남아 있습니다.

PEP는 "어노테이션의 대상은 적어도 구문 적으로 유효한 단일 할당 대상이 될 수 있습니다 (이와 함께 수행 할 작업은 유형 검사기에게 달려 있음)"라고 명시합니다. 이는 키가 존재하지 않아도됨을 의미합니다. 주석이 추가되었습니다 (따라서 아니오 KeyError). 다음은 원래 PEP의 예입니다.

d = {}
d['a']: int = 0  # Annotates d['a'] with int.
d['b']: int      # Annotates d['b'] with int.

일반적으로 주석 표현식 Python 유형으로 평가 되어야 합니다. 주석의 모든 주요 사용은 유형 힌팅이지만 강제되지는 않습니다. 주석은 결과의 유형 또는 값에 관계없이 유효한 Python 표현식이 될 수 있습니다 .

보시다시피, 현재 유형 힌트는 mypy 와 같은 정적 유형 검사기가 없다면 매우 관대하고 거의 유용하지 않습니다 .


12
=그러면 할당 연산자가 필요하지 않습니까? 키가 존재하지 않습니다. 이것은 나에게 잘못된 느낌입니다.
justengel

1
이 경우, : 할당 연산자. 우리는 키가 아니라 유형 주석 만 "할당"하는 것입니다. 나는 그것을 허용하는 이유가 있는지 의심 스럽습니다. 단지 주석 구문을 추가하는 의도하지 않은 부수적 인 영향입니다.
chepner

1
@chepner 이것이 부작용이 아닌 것 같습니다. 이것이 바로 해당 PEP가 수행하도록 설계된 것입니다.
Ma0

6
아직 정의되지 않은 대상에 주석을 달 수 있다는 것이 이상합니다. 내 첫 번째 줄이 x: str이고 바로 뒤에 오는 type(x)경우 인터프리터는 NameError. IMO는 구문이 객체를 사전 정의하거나 현장에서 정의해야합니다. 이것은 단지 혼란을 야기합니다.
r.ook

2
@Idlehands 이것은 목적을 무너 뜨립니다. 데 x = 'i am a string'이전에 x: str중복 후자의 종류를 만든다 ..이 전혀 추가되지 않았을 것이다. 코멘트로 괜찮 았습니다. 나는 그것이 어떤 방법으로 사용되었는지 결코 보여주지 않습니다.
Ma0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.