programing

Python 3.5의 타입 힌트는 무엇입니까?

itsource 2022. 9. 28. 23:37
반응형

Python 3.5의 타입 힌트는 무엇입니까?

Python 3.5에서 가장 많이 거론되는 기능 중 하나는 유형 힌트입니다.

유형 힌트의 는 이 문서와 이 문서에서 언급하고 유형 힌트를 책임 있게 사용하는 것도 언급하고 있습니다.누가 그것들을 언제, 언제 사용해야 하는지, 언제 사용하지 말아야 하는지 더 설명해 줄 수 있나요?

나는 PEP 483과 PEP 484를 읽고Guido의 Type Humpting 프레젠테이션을 볼 을 제안한다.

한마디로:글자 그대로 글자 그대로의 의미입니다. 사용 중인 오브젝트 유형을 힌트합니다.

Python의 동적 특성으로 인해 사용되는 객체의 유형을 추론하거나 확인하는 것은 특히 어렵습니다.이 사실은 개발자가 아직 작성하지 않은 코드에서 정확히 무슨 일이 일어나고 있는지 이해하기 어렵게 만들고, 가장 중요한 것은 오브젝트의 종류를 나타내는 인디케이터가 없기 때문에 제한된 많은 IDE(PyCharm 및 PyDev)에서 볼 수 있는 타입 체크 툴입니다.그 결과, (프레젠테이션에서 언급한 바와 같이) 성공률이 약 50%인 유형을 추론하는 데 의존합니다.


유형 힌트 프레젠테이션에서 두 개의 중요한 슬라이드를 가져오려면:

힌트를 입력하는 이유

  1. 유형 체커를 지원합니다.예를 들어 예기치 않은 유형의 객체를 전달하고 있는 경우 객체를 어떤 유형으로 할 것인지를 암시함으로써 쉽게 검출할 수 있습니다.
  2. 문서 작성에 도움이 됩니다.코드를 보고 있는 제3의 사용자는 코드를 입수하지 않고 어디서 사용하는지 알 수 있습니다.TypeErrors.
  3. IDE가 보다 정확하고 견고한 툴을 개발할 수 있도록 지원합니다.개발환경은 객체의 유형을 알고 있을 때 적절한 방법을 제안하는데 더 적합합니다.IDE를 사용하여 이 문제를 경험한 적이 있을 것입니다..오브젝트에 정의되어 있지 않은 메서드/속성이 팝업 됩니다.

정적 타입 체커를 사용하는 이유

  • 버그 검출 시간 단축:이것은 자명하다고 생각합니다.
  • 프로젝트 규모가 클수록많은 것이 필요합니다.이것도 일리가 있습니다.정적 언어는 동적 언어에는 없는 견고성과 제어를 제공합니다.애플리케이션의 규모가 커지고 복잡해질수록 (행동적인 측면에서) 필요한 제어성과 예측성이 높아집니다.
  • 대규모 팀은 이미 정적 분석을 실행하고 있습니다.이게 처음 두 가지를 입증하는 것 같아요.

이 작은 소개의 마지막 메모로서:이것은 옵션 기능으로, 제가 아는 바로는 스태틱 타이핑의 이점을 얻기 위해 도입된 것으로 알고 있습니다.

일반적으로 걱정할 필요없으며, Python을 보조 스크립트 언어로 사용하는 경우에는 사용할 필요가 없습니다.이는 매우 필요한 견고성, 제어 기능 및 추가 디버깅 기능을 제공하기 때문에 대규모 프로젝트를 개발할 때 유용합니다.


mypy를 사용한 힌트 입력:

이 답변을 보다 완전하게 하기 위해서는 약간의 데모를 하는 것이 좋다고 생각합니다.PEP에 제시된 Type Hents에 영감을 준 라이브러리를 사용합니다.이 문서는 주로 이 질문에 부딪혀 어디서부터 시작해야 할지 고민하는 사람들을 위해 작성되었습니다.

전에 다시 한 번 강조하겠습니다.PEP 484는 아무것도 강제하지 않습니다.단순히 기능 주석의 방향을 설정하고 유형 검사를 수행할 수 있는/실행해야 하는 방법에 대한 지침을 제안합니다.원하는 만큼 함수와 힌트에 주석을 달 수 있습니다. Python 자체는 주석을 사용하지 않기 때문에 주석의 유무에 관계없이 스크립트는 계속 실행됩니다.

어쨌든 PEP에서 기술한 바와 같이 힌트유형은 일반적으로 다음 3가지 형태를 취합니다.

  • 기능 주석(PEP 3107)
  • 내장/사용자 모듈용 스터브파일
  • ★★★★★ # type: type첫 번째 두 가지 양식을 보완하는 코멘트입니다.(변수 주석이란?을 참조해 주세요.Python 3.6 업데이트의 경우# type: typecomments ()

또한 에 소개된 새 모듈과 함께 유형 힌트를 사용할 수도 있습니다.Py3.5많은 (추가) ABC(추상 베이스 클래스)가 정적 체크에 사용하기 위한 도우미 기능 및 장식기와 함께 정의되어 있습니다.의 대부분의 ABCcollections.abc를 포함하지만 서브스크립션을 허용하기 위해 범용적인 형식으로(를 정의함으로써)__getitem__()★★★★★★★★★★★★★★★★★★」

자세한 설명에 관심이 있는 분이라면,는 매우 잘 쓰여져 있고, 체커의 기능을 실증/설명하는 코드샘플도 다수 준비되어 있습니다.읽을 가치가 있습니다.

기능 주석 및 특수 주석:

첫째, 특별한 댓글을 사용할 때 얻을 수 있는 행동을 관찰하는 것은 흥미롭다. ★★★★★# type: type개체 유형을 직접 추론할 수 없는 경우 변수 할당 중에 주석을 추가하여 개체 유형을 나타낼 수 있습니다.단순 할당은 일반적으로 쉽게 추론할 수 있지만 목록과 같은 다른 할당은 쉽게 추론할 수 없습니다.

참고: 파생 컨테이너를 사용하고 해당 컨테이너에 대한 내용을 지정해야 하는 경우 컨테이너의 일반 유형을 사용해야 합니다.typing모듈.인덱싱을 지원합니다.

# Generic List, supports indexing.
from typing import List

# In this case, the type is easily inferred as type: int.
i = 0

# Even though the type can be inferred as of type list
# there is no way to know the contents of this list.
# By using type: List[str] we indicate we want to use a list of strings.
a = []  # type: List[str]

# Appending an int to our list
# is statically not correct.
a.append(i)

# Appending a string is fine.
a.append("i")

print(a)  # [0, 'i']

하면 모든 합니다.print(a)합니다.a . 。# type코멘트는 폐기되어 추가 의미 의미가 없는 플레인 코멘트로 취급된다.

명령어를 「」와 함께 mypy 우리는 과 같은 수 있습니다: ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ.

(Python3)jimmi@jim: mypy typeHintsCode.py
typesInline.py:14: error: Argument 1 to "append" of "list" has incompatible type "int"; expected "str"

「 」의 을 나타냅니다.str에는 objects오 an an를 할 수 없습니다.int정적으로 말하면, 그것은 소리입니다.는 하다, 하다, 하다, 하다, 하다, 하다, 하다, , 둘 중 할 수 있습니다.astr의 .a이든 허용 가능한).List[Any]끝나고Any에서 Import 되었습니다.typing).

기능 주석이 양식에 추가됩니다.param_name : type함수 시그니처의 각 파라미터와 반환유형을 지정하기 전에-> type끝 함수 콜론 앞의 표기법, 모든 주석은 에 저장됩니다.__annotations__편리한 사전 형식으로 해당 함수의 속성을 지정합니다.간단한 예(에서 추가 유형이 필요 없음)를 사용합니다.typing모듈):

def annotated(x: int, y: str) -> bool:
    return x < y

annotated.__annotations__attribute에는 다음 값이 지정되었습니다.

{'y': <class 'str'>, 'return': <class 'bool'>, 'x': <class 'int'>}

우리가 완전히 초보이거나 Python 2.7 컨셉에 익숙하고 결과적으로 그 개념에 대해 알지 못하는 경우TypeError비교 속에 숨어 있다annotated다음 정적 체크를 수행하여 오류를 검출하고 수고를 덜 수 있습니다.

(Python3)jimmi@jim: mypy typeHintsCode.py
typeFunction.py: note: In function "annotated":
typeFunction.py:2: error: Unsupported operand types for > ("str" and "int")

특히 잘못된 인수로 함수를 호출하는 것도 검출됩니다.

annotated(20, 20)

# mypy complains:
typeHintsCode.py:4: error: Argument 2 to "annotated" has incompatible type "int"; expected "str"

이러한 오류는 기본적으로 모든 사용 사례로 확장할 수 있으며, 발견된 오류는 기본 통화 및 운영보다 더 확장됩니다.당신이 확인할 수 있는 유형은 매우 유연하며, 나는 단지 그것의 잠재력에 대해 살짝 언급했을 뿐이다.를 보다typing모듈, PEP 또는mypy메뉴얼에서는, 제공되는 기능에 대해 보다 포괄적인 정보를 얻을 수 있습니다.

스터브 파일:

스터브 파일은 서로 배타적이지 않은2개의 경우에 사용할 수 있습니다.

  • 함수 시그니처를 직접 변경하지 않을 모듈 체크라고 입력해야 합니다.
  • 모듈을 작성하고 유형 검사를 수행하지만 주석과 내용을 분리하려고 합니다.

어떤 stub 파일(확장자:.pyi)는 사용하려는 모듈의 주석이 달린 인터페이스입니다.여기에는 폐기된 함수의 본문을 사용하여 유형 체크하는 함수의 시그니처가 포함됩니다.이를 이해하기 위해서는 모듈 내의 랜덤함수 3가지 세트를 지정해 주십시오.randfunc.py:

def message(s):
    print(s)

def alterContents(myIterable):
    return [i for i in myIterable if i % 2 == 0]

def combine(messageFunc, itFunc):
    messageFunc("Printing the Iterable")
    a = alterContents(range(1, 20))
    return set(a)

stub 파일을 생성할 수 있습니다.randfunc.pyi필요에 따라 몇 가지 제한을 둘 수 있습니다.단점은 스텁 없이 소스를 보고 있는 누군가가 어떤 것이 어디로 전달되어야 하는지 이해하려고 할 때 주석 지원을 받을 수 없다는 것입니다.

어쨌든 stub 파일의 구조는 매우 단순합니다.빈 본문을 사용하여 모든 함수 정의 추가(passfiled) 및 필요에 따라 주석을 입력합니다.여기, 예를 들어, 우리가 단지 다른 사람들과 함께 일하고 싶다고 가정해 봅시다.int컨테이너의 유형입니다.

# Stub for randfucn.py
from typing import Iterable, List, Set, Callable

def message(s: str) -> None: pass

def alterContents(myIterable: Iterable[int])-> List[int]: pass

def combine(
    messageFunc: Callable[[str], Any],
    itFunc: Callable[[Iterable[int]], List[int]]
)-> Set[int]: pass

combine이 함수는 다른 파일에서 주석을 사용하는 이유를 알 수 있습니다.이 함수는 때때로 코드를 혼란시키고 가독성을 떨어뜨립니다(Python의 경우 big no-no).물론 에일리어스 타입을 사용할 수도 있지만 도움이 되지 않는 경우가 있습니다(따라서 현명하게 사용).


Python 타입의 헨트사용된 활자 검사기는 다음과 같습니다.mypyIDE(PyCharm) 내부 및 표준 Python 모듈로 표시되는 팝업창이 점차 많아질 것입니다.

다음 목록에 체커/관련 패키지를 찾으면 추가해 보겠습니다.

내가 알고 있는 체커:

  • Mypy: 여기에 설명된 바와 같습니다.
  • PyType: Google은 제가 수집한 것과 다른 표기법을 사용하고 있습니다.아마 볼 가치가 있을 겁니다.

관련 패키지/프로젝트:

  • typed: 표준 라이브러리용 stub 파일 모음을 저장하는 공식 Python 저장소입니다.

typeshed프로젝트는 실제로 자신의 프로젝트에서 유형 힌트를 어떻게 사용할 수 있는지 확인할 수 있는 가장 좋은 장소 중 하나입니다.해당 클래스의 덤을 예로 들어 보겠습니다..pyi 삭제:

class Counter(Dict[_T, int], Generic[_T]):
        @overload
        def __init__(self) -> None: ...
        @overload
        def __init__(self, Mapping: Mapping[_T, int]) -> None: ...
        @overload
        def __init__(self, iterable: Iterable[_T]) -> None: ...

여기서 는 범용 클래스를 정의하는 데 사용됩니다.를 위해Counter에서 인수를 않고 "1"을 수 .Mapping에서 '유형'으로int 또는 를 선택합니다.Iterable모든 타입의


주의: 한 가지 깜빡 잊고 말씀드리지 못한 것은typing모듈은 잠정적으로 도입되었습니다.PEP 411부터:

임시 패키지는 API를 "안정적" 상태로 "그라드"하기 전에 수정할 수 있습니다.한편, 이 상태는 패키지가 공식적으로 Python 배포의 일부라는 이점을 제공합니다.한편, 핵심 개발팀은 패키지 API의 안정성에 대해서는 어떠한 약속도 하지 않으며, 다음 릴리즈에 대해서는 변경될 수 있다고 명시하고 있습니다.가능성이 낮은 결과로 간주되지만 API 또는 유지보수에 대한 우려가 충분한 근거가 있는 경우 이러한 패키지는 폐지 기간 없이 표준 라이브러리에서 삭제될 수도 있습니다.

그래서 여기 있는 것들을 조금 염두해 보세요; 나는 그것이 제거되거나 중요한 방식으로 바뀔지 의심스럽지만, 아무도 알 수 없습니다.


** 다른 토픽은 모두 유효하지만 type-hints 범위에서는 유효합니다: 변수 주석의 구문은 치환의 노력입니다.# type하여 사용자가 변수 을 달 수 합니다.varname: type★★★★★★★★★★★★★★★★★★.

이러한 설명에 대한 자세한 내용은 앞에서 설명한 변수 주석이란? 참조하십시오.

짐의 정교한 답변에 덧붙여:

모듈을 확인합니다.이 모듈은 PEP 484에서 지정된 유형 힌트를 지원합니다.

를 들어,는 타입의 합니다.str에는 다음과 같이 주석이 붙어 있습니다.

def greeting(name: str) -> str:
    return 'Hello ' + name

typing모듈도 다음 기능을 지원합니다.

  1. 에일리어싱을 입력합니다.
  2. 콜백 함수의 힌트를 입력합니다.
  3. 일반 - 컨테이너 요소에 대해 예상되는 유형을 나타내도록 구독을 지원하도록 추상 기본 클래스가 확장되었습니다.
  4. 사용자 정의 일반 유형 - 사용자 정의 클래스를 일반 클래스로 정의할 수 있습니다.
  5. 모든 유형 - 모든 유형은 Any의 하위 유형입니다.

이번에 출시된 PyCharm 5는 타입 힌트를 지원합니다.이에 대한 블로그 투고(PyCharm 5의 Python 3.5 타입 힌트 참조)에서는 힌트 타입에 대한 훌륭한 설명과 함께 코드에서 힌트를 사용하는 방법에 대한 몇 가지 예시와 일러스트를 제공하고 있습니다.

또한 Python 2.7에서 지원되며, 이는 다음과 같습니다.

PyCharm은 Python 2.7, Python 3.2-3.4용 PyPI 입력 모듈을 지원합니다.2.7의 경우 함수 주석이 Python 3.0에 추가되었기 때문에 *.pyi stub 파일에 유형 힌트를 넣어야 합니다.

유형 힌트는 유지보수를 위한 것이며 Python에 의해 해석되지 않습니다. 중 은 "" " " " 입니다.def add(self, ic:int)이 올 하지 않습니다.return... 표시:

class C1:
    def __init__(self):
        self.idn = 1
    def add(self, ic: int):
        return self.idn + ic

c1 = C1()
c1.add(2)

c1.add(c1)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "<input>", line 5, in add
TypeError: unsupported operand type(s) for +: 'int' and 'C1'

Python은 동적 타입 체크를 가지고 있기 때문에 타입은 런타임에 알려지고 컴파일 타임에는 알려지지 않습니다(C#과 같은 정적 타입 체크 언어).

TypeHints에서 Python은 str, int, float, bool 및 None 언어로 지원되는 기본 변수 유형에 대한 유형 주석을 지원합니다.또한 타이핑 라이브러리 배터리도 포함되어 있습니다.이 타이핑 라이브러리는 보다 특별한 타입을 사용할 수 있는 수단을 제공합니다.

from typing import List

name: str = 'Tommy'
age: int = 24
height_in_meters: float = 1.7

상세내용: https://tomisin.dev/blog/python-projects-with-type-hints

언급URL : https://stackoverflow.com/questions/32557920/what-are-type-hints-in-python-3-5

반응형