저는 Python 3.6.1을 사용하고 있는데 매우 이상한 것을 발견했습니다. 검색하는 데 오랜 시간이 걸리는 간단한 사전 할당 오타가 있습니다.
context = {}
context["a"]: 2
print(context)
산출
{}
코드는 무엇을 context["a"]: 2
하고 있습니까? SyntaxError
IMO가 필요한 경우를 제기하지 않습니다 . 처음에는 슬라이스를 만들고 있다고 생각했습니다. 그러나 입력 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 와 같은 정적 유형 검사기가 없다면 매우 관대하고 거의 유용하지 않습니다 .