Python Language
유형 힌트
수색…
통사론
- [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'
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!')
키워드 인수가 일반적으로 스타일 지정되는 것과 반대되는 등호 주변의 공백에주의하십시오.