수색…


통사론

  • [int, str], None] -> def func (a : int, b : str) -> 없음
  • [str, int] -> { "a": 1, "b": 2, "c": 3}
  • typing.List [int] -> [1, 2, 3]
  • typing.Set [int] -> {1, 2, 3}
  • typing.Optional [int] -> 없음 또는 int
  • 순서 [int] -> [1, 2, 3] 또는 (1, 2, 3)
  • typing.Any -> 모든 유형
  • 유니온 [int, str] -> 1 또는 "1"
  • T = typing.TypeVar ( 'T') -> 일반 유형

비고

형식 힌트는 PEP 484 지정된대로 Python 코드의 값 유형을 정적으로 나타 내기위한 형식화 된 솔루션입니다. 타입 - 힌트는 typing 모듈 옆에 나타나서 파이썬 사용자에게 코드에 주석을 달아서 타입 체커를 도와 줌과 동시에 코드에 더 많은 정보를 간접적으로 문서화하는 기능을 제공합니다.

일반 유형

typing.TypeVar 는 제네릭 형식 팩터 리입니다. 기본 목표는 일반 함수 / 클래스 / 메소드 주석에 대한 매개 변수 / 자리 표시 자 역할을하는 것입니다.

import typing

T = typing.TypeVar("T")

def get_first_element(l: typing.Sequence[T]) -> T:
    """Gets the first element of a sequence."""
    return l[0]

함수에 유형 추가하기

두 개의 인수를 받고 그 합을 나타내는 값을 반환하는 함수의 예를 들어 봅시다.

def two_sum(a, b):
    return a + b

이 코드를 two_sum 함수에 대한 인수의 유형을 안전하고 two_sum 나타낼 수 없습니다. int 값과 함께 제공되는 경우에도 작동합니다.

print(two_sum(2, 1))  # result: 3

문자열과 함께 :

print(two_sum("a", "b"))  # result: "ab"

list , tuple 등과 같은 다른 값을 사용한다.

파이썬 유형의 동적 특성으로 인해 주어진 작업에 많은 것을 적용 할 수있는 유형 검사기는이 함수 호출이 허용되어야하는지 여부를 합리적으로 주장 할 수 없습니다.

유형 검사기를 돕기 위해 우리가 허용하는 유형을 나타내는 함수 정의에 유형 힌트를 제공 할 수 있습니다.

우리가 단지 int 타입을 허용하기를 원한다는 것을 나타 내기 위해 다음과 같이 함수 정의를 변경할 수 있습니다 :

def two_sum(a: int, b: int):
    return a + b

주석은 인수 이름 뒤에 나오며 : 문자로 구분됩니다.

비슷하게, str 타입들만이 허용된다는 것을 나타 내기 위해서, 우리는 함수를 변경하여 그것을 명시 할 것이다 :

def two_sum(a: str, b: str): 
    return a + b

인수의 유형을 지정하는 것 외에도 함수 호출의 리턴 값을 나타낼 수도 있습니다. 이것은 -> 문자 다음에 인수 목록의 닫는 괄호 뒤의 형식을 추가 하지만 함수 선언 끝 부분의 : 앞에 추가됩니다.

def two_sum(a: int, b: int) -> int: 
    return a + b

이제 우리는 two_sum 을 호출 할 때 반환 값이 int 유형이어야한다고 지정했습니다. 마찬가지로 str , float , list , set 및 기타 값에 대해 적절한 값을 정의 할 수 있습니다.

형식 힌트는 주로 형식 검사기 및 IDE에서 사용되지만 때때로 검색해야 할 수도 있습니다. 이것은 __annotations__ 특수 속성을 사용하여 수행 할 수 있습니다.

two_sum.__annotations__
# {'a': <class 'int'>, 'b': <class 'int'>, 'return': <class 'int'>}

클래스 멤버 및 메서드

class A:
    x = None  # type: float
    def __init__(self, x: float) -> None:
        """
        self should not be annotated
        init should be annotated to return None
        """
        self.x = x
    
    @classmethod
    def from_int(cls, x: int) -> 'A': 
        """
        cls should not be annotated
        Use forward reference to refer to current class with string literal 'A'
        """
        return cls(float(x))

함수가 정의 될 때 주석이 평가되기 때문에 현재 클래스의 전방 참조가 필요합니다. 전달 참조는 가져온 경우 순환 가져 오기를 발생시키는 클래스를 참조 할 때도 사용할 수 있습니다.

변수 및 속성

변수는 주석을 사용하여 주석 처리됩니다.

x = 3  # type: int
x = negate(x)
x = 'a type-checker might catch this error'
파이썬 3.x 3.6

Python 3.6부터는 변수 주석을위한 새로운 구문 도 있습니다. 위의 코드는 양식을 사용할 수 있습니다.

x: int = 3

주석과 달리, 이전에 선언되지 않은 변수에 값을 설정하지 않고 형식 힌트를 추가하는 것만으로도 가능합니다.

y: int

또한 이들이 모듈 또는 클래스 수준에서 사용 typing.get_type_hints(class_or_module) 사용하여 유형 힌트를 검색 할 수 있습니다.

class Foo:
    x: int
    y: str = 'abc'

print(typing.get_type_hints(Foo))
# ChainMap({'x': <class 'int'>, 'y': <class 'str'>}, {})

또는 __annotations__ 특수 변수 또는 속성을 사용하여 액세스 할 수 있습니다.

x: int
print(__annotations__)
# {'x': <class 'int'>}

class C:
    s: str
print(C.__annotations__)
# {'s': <class 'str'>}

NamedTuple

typing 모듈에서 NamedTuple 함수를 사용하여 힌트 유형으로 명명 된 튜플을 생성합니다 :

import typing
Point = typing.NamedTuple('Point', [('x', int), ('y', int)])

결과 형식의 이름은 함수의 첫 번째 인수이지만 형식 검사기의 작업을 쉽게하기 위해 같은 이름의 변수에 할당해야합니다.

키워드 인수에 대한 유형 힌트

def hello_world(greeting: str = 'Hello'):
    print(greeting + ' world!')

키워드 인수가 일반적으로 스타일 지정되는 것과 반대되는 등호 주변의 공백에주의하십시오.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow