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

저는 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.

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



답변

실수로 구문 상 올바른 변수 주석을 작성했습니다 . 이 기능은 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 와 같은 정적 유형 검사기가 없다면 매우 관대하고 거의 유용하지 않습니다 .


답변