복붙노트

[PYTHON] Python 3.6의 변수 주석은 무엇입니까?

PYTHON

Python 3.6의 변수 주석은 무엇입니까?

파이썬 3.6이 곧 출시 될 예정이다. PEP 494 - Python 3.6 Release Schedule은 12 월말을 언급하므로 Python 3.6의 새로운 기능을 통해 변수 주석을 언급합니다.

그래서 필자가 읽은 것부터 파이썬 3.5에서 오는 타입 힌트의 일부입니다. 파이썬 3.5에서 타입 힌트 란 무엇입니까?

나는 선장을 따른다 : str과 클래스 Starship 예제, 그러나 마지막 것에 대해 확실하지 않다 : 어떻게 소수 : List [int] = []는 설명 할 수 있는가? 정수 만 허용하는 빈 목록을 정의하고 있습니까?

해결법

  1. ==============================

    1.모든 사이 :와 =는 형식 힌트이므로 소수는 실제로 List [int]로 정의되고 처음에는 빈 목록으로 설정됩니다 (통계는 초기에 Dict [str, int]로 정의 된 빈 사전입니다).

    모든 사이 :와 =는 형식 힌트이므로 소수는 실제로 List [int]로 정의되고 처음에는 빈 목록으로 설정됩니다 (통계는 초기에 Dict [str, int]로 정의 된 빈 사전입니다).

    List [int]와 Dict [str, int]는 다음 구문의 일부는 아니지만, 이미 Python 3.5 타이핑 힌트 PEP에 정의되어 있습니다. 3.6 PEP 526 - 변수 주석에 대한 구문 제안서에서는 변수에 동일한 힌트를 첨부하는 구문 만 정의합니다. 주석이있는 변수에만 유형 힌트를 첨부 할 수 있습니다 (예 : primes = [] # List [int]).

    List와 Dict는 모두 Generic 유형이며, 특정 (구체적인) 내용으로 목록 또는 사전 매핑을 가지고 있음을 나타냅니다.

    List에는 목록에있는 모든 요소의 유형 인 '인수'([...] 구문의 요소) 만 있습니다. Dict의 경우 첫 번째 인수는 키 유형이고 두 번째 인수는 값 유형입니다. 소수 목록의 모든 값은 정수이고 통계 사전의 모든 키 - 값 쌍은 (str, int) 쌍이며 문자열을 정수로 매핑합니다.

    typing.List 및 typing.Dict 정의, Generics 섹션 및 PEP 483 - Type Hints 이론을 참조하십시오.

    함수에 대한 힌트 유형과 마찬가지로이 클래스의 사용은 선택 사항이며 주석을 고려해야합니다 (이 태그를 첨부 할 객체가 있으므로 클래스의 모듈 및 속성의 전역이지만 함수의 지역은 제외). __annotations__ 속성을 통해 인트로 스펙트 할 수 있습니다. 이러한 주석에 임의의 정보를 첨부 할 수 있습니다. 유형 힌트 정보에만 국한되지 않습니다.

    전체 제안서를 읽을 수도 있습니다. 여기에는 새로운 구문을 뛰어 넘는 몇 가지 추가 기능이 포함되어 있습니다. 그러한 주석이 언제 평가되는지, 그것들을 어떻게 조사 할 것인가, 그리고 어떤 것을 클래스 속성 대 인스턴스 속성으로 선언하는 방법을 지정한다.

  2. ==============================

    2.변수 어노테이션은 PEP 484에서 정의 되었기 때문에 # 유형 주석의 다음 단계 일뿐입니다. 이 변화의 근거는 PEP 526의 각 섹션에 강조되어 있습니다.

    변수 어노테이션은 PEP 484에서 정의 되었기 때문에 # 유형 주석의 다음 단계 일뿐입니다. 이 변화의 근거는 PEP 526의 각 섹션에 강조되어 있습니다.

    그래서, 다음과 같이 타입을 암시하는 대신에 :

    primes = []  # type: List[int]
    

    다음과 같은 형식의 할당을 사용하여 유형에 직접 주석을 달 수있는 새로운 구문이 도입되었습니다.

    primes: List[int] = []
    

    @Martijn이 지적했듯이, 입력시 사용할 수있는 유형을 사용하고 빈 목록으로 초기화하여 정수 목록을 나타냅니다.

    도입 된 첫 번째 변경 사항은 : 문자 다음에 독립형 또는 값을 할당하면서 선택적으로 주석을 달거나 형식을 사용하여 이름에 주석을 추가 할 수있는 새로운 구문입니다.

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

    그래서 문제의 예 :

       primes: List[int] = [ ]
    #    ^        ^         ^
    #  augtarget  |         |
    #         expression    |
    #                  expression (optionally initialize to empty list)
    

    새로운 구문과 함께 추가 변경 사항도 도입되었습니다. 모듈과 클래스는 이제 형식 메타 데이터가 첨부 된 __annotations__ 특성을가집니다 (함수가 PEP 3107 - 함수 주석 이후에 있었던 것처럼).

    from typing import get_type_hints  # grabs __annotations__
    

    이제 __main __.__ annotations__에는 선언 된 유형이 있습니다.

    >>> from typing import List, get_type_hints
    >>> primes: List[int] = []
    >>> captain: str
    >>> import __main__
    >>> get_type_hints(__main__)
    {'primes': typing.List<~T>[int]}
    

    get_type_hints는 모듈에서 액세스 할 수있는 유형 만 반환하기 때문에 capther는 현재 get_type_hints를 통해 표시되지 않습니다. 즉, 먼저 값이 필요합니다.

    >>> captain = "Picard"
    >>> get_type_hints(__main__)
    {'primes': typing.List<~T>[int], 'captain': <class 'str'>}
    

    print (__ annotations__)를 사용하면 'captain'이 표시되지만 실제로 __annotations__에 직접 액세스하면 안됩니다.

    마찬가지로, 클래스의 경우 :

    >>> get_type_hints(Starship)
    ChainMap({'stats': typing.Dict<~KT, ~VT>[str, int]}, {})
    

    여기서 ChainMap은 주어진 클래스 (첫 번째 매핑에 위치)에 대한 주석과 mro에서 발견되는 기본 클래스에 정의 된 모든 주석 (결과 매핑, 객체에 대한 {})을 가져 오는 데 사용됩니다.

    새로운 구문과 함께 클래스 변수를 나타 내기 위해 새로운 ClassVar 유형이 추가되었습니다. 네, 예제의 통계는 실제로는 ClassVar가 아닌 인스턴스 변수입니다.

    PEP 484의 타입 힌트와 마찬가지로, 이것들은 완전히 선택 사항이며 타입 검사 도구 (그리고이 정보를 바탕으로 빌드 할 수있는 다른 것)에 주로 사용됩니다. Python 3.6의 안정 버전이 출시 될 때 잠정적으로 이루어 지므로 나중에 작은 수정이 추가 될 수 있습니다.

  3. from https://stackoverflow.com/questions/39971929/what-are-variable-annotations-in-python-3-6 by cc-by-sa and MIT license