일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 네트워크
- 네트워크보안
- 데이터분석
- 웹개발
- 컴퓨터비전
- 인공지능
- 소프트웨어
- 알고리즘
- 딥러닝
- 프로그래밍언어
- 클라우드컴퓨팅
- 파이썬
- 프로그래밍
- Yes
- 데이터과학
- I'm Sorry
- 코딩
- 자료구조
- 데이터구조
- 자바스크립트
- 사이버보안
- 보안
- 버전관리
- 빅데이터
- 데이터베이스
- 머신러닝
- 소프트웨어공학
- 컴퓨터과학
- 2
- 컴퓨터공학
- Today
- Total
스택큐힙리스트
파이썬 3.5에서의 타입 힌트란 무엇인가요? 본문
파이썬 3.5에서 가장 많이 이야기되는 기능 중 하나는 타입 힌트입니다.
형식 힌트의 예는 this article 및 this one에서 언급되며, 형식 힌트를 책임 있게 사용하도록 언급합니다. 그들에 대해 더 자세히 설명하고 언제 사용해야하고 언제 사용하지 말아야하는지 설명해 주실 수 있나요?
답변 1
제안드리는 것은 PEP 483와 PEP 484를 읽으시고, this presentation을 보시며, type hinting에 관한 Guido의 내용을 학습하는 것입니다.
요약하자면: 타입 힌팅(Type Hinting)은 말 그대로 단어가 의미하는 대로, 사용하는 객체의 타입을 암시하는 것입니다.
파이썬의 동적 특성 때문에 사용중인 객체의 타입을 추측하거나 확인하는 것은 특히 어렵습니다. 이러한 사실로 인해 개발자들은 자신이 작성하지 않은 코드에서 무엇이 일어나고 있는지 정확히 이해하기 어렵고, 더 중요한 것은 많은 IDE에서 찾을 수 있는 타입 체크 도구들(예를 들면 PyCharm 과 PyDev 등)은 객체의 타입에 대한 지표가 없어서 한계가 있습니다. 결과적으로, 이러한 도구들은 언급된 것처럼 대략 50%의 성공률로 타입을 추론하려고 시도합니다.
타입 힌팅 프리젠테이션에서 중요한 두 개의 슬라이드를 가져오는 것:
타입 힌트의 이유는 무엇인가요?
타입 체커를 지원합니다: 원하는 객체 유형을 암시하여 객체에 전달되는 예상되지 않은 타입의 객체를 쉽게 탐지할 수 있도록 합니다.
문서화에 도움을 줍니다 : 코드를 볼 때 제3자는 어디에 무엇이 예상되는지, 따라서 그들이 TypeErrors같은 것을 받지 않고 사용하는 방법을 알 수 있습니다.
IDE가 더 정확하고 견고한 도구를 개발하는 데 도움이됩니다. 개발 환경은 객체의 유형을 알면 적절한 메서드를 제안하는 것이 더 적합해집니다. 어떤 IDE에서는 .를 누르면 객체에 정의되어 있지 않은 메서드/속성이 표시되는 경우가 있습니다.
정적 타입 체커를 사용하는 이유는 무엇인가요?
버그를 빨리 찾으세요 : 저는 이게 당연하다고 믿습니다.
당신의 프로젝트가 크면 클수록 그것이 더 필요하다: 다시 말해, 이것은 합리적입니다. 정적 언어는 동적 언어에서 부족한 견고성과 제어 기능을 제공합니다. 더 크고 복잡한 애플리케이션은 행동 측면에서 더 많은 제어와 예측 가능성이 필요합니다.
대규모 팀은 이미 정적 분석을 실행 중입니다: 나는 이것이 처음 두 점을 검증하는 것으로 추정합니다.
이 작은 소개 글의 마지막으로 : 이것은 선택적인 기능이며, 제가 이해한 바로는 정적 타입의 이점을 얻기 위해 도입된 것입니다.
일반적으로 걱정하지 않아도 되고 특히 Python을 보조 스크립트 언어로 사용하는 경우에는 사용하지 않아도 됩니다. 그러나 대형 프로젝트를 개발할 때 필요한 강건성, 제어 및 추가 디버깅 기능을 제공하기 때문에 도움이 될 것입니다.
마이파이를 사용한 타입 힌팅 :
이 답변을 보다 완전하게 만들기 위해서는 작은 데모가 적당할 것 같습니다. 저는 PEP에서 Type Hints가 제시되는 것처럼 영감을 준 mypy 라이브러리를 사용할 것입니다. 주로 이 질문에 부딪히고 어디에서부터 시작해야 할지 궁금한 누구든지 위해 작성되었습니다.
그 전에 부연 설명을 하자면, PEP 484 는 무언가를 강제하지 않고, 단순히 함수 주석의 방향을 설정하고 타입 체크가 어떻게 이루어져야 하는지에 대한 가이드라인을 제안합니다. 당신은 함수를 주석으로 유도하고 원하는 만큼 많은 것을 힌트로 사용할 수 있지만, Python 자체는 주석을 사용하지 않기 때문에 존재 여부에 관계없이 스크립트는 계속 실행됩니다.
어쨌든, PEP에서 언급한 대로, 힌트 타입은 일반적으로 세 가지 형식을 취해야합니다.
기능 어노테이션 ( PEP 3107 ).
내장/사용자 모듈용 스텁 파일.
첫 번째 두 형식을 보완하는 특별한 # type: type 주석. (참조: Python 3.6 업데이트 What are variable annotations? # type: type 주석에 대한)
또한, 새로운 typing 모듈과 함께 타입 힌트를 사용해야합니다. 그 안에는 정적 확인에 사용할 수 있는 보조 함수 및 데코레이터와 함께 많은 (추가적인) #$*^^^$$& (추상 기본 클래스)가 정의되어 있습니다. collections.abc의 대부분의 ABC가 포함되어 있지만, __getitem__() 메서드를 정의하여 구독을 허용하기 위해 범용 형식으로 제공됩니다.
이에 대해 더 자세한 설명에 관심이 있는 경우, mypy documentation은 매우 잘 쓰여져 있으며 체커의 기능을 설명하는 많은 코드 샘플을 제공하고 있으므로 꼭 읽어볼 가치가 있습니다.
함수 주석과 특별한 코멘트:
먼저, 특수한 주석을 사용할 때 얻을 수 있는 일부 동작을 관찰하는 것은 흥미롭습니다. 특수한 # 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!@ 객체 목록이 특정 @#int 을 포함할 수 없음을 나타내는 것은, 정적으로 말하면 올바릅니다. 이것은 str!@ 객체만 추가하거나 a 내용의 유형을 변경하여 모든 값이 허용됨을 나타내는 것으로 해결할 수 있습니다(이는 Any가 typing에서 가져온 후 List[Any]로 직관적으로 수행됩니다).
함수 주석은 함수 식별자에 따라 각 매개변수 뒤에 param_name : type 의 형식으로 추가되며, 반환 유형은 끝나는 함수 콜론 앞에 -> type 의 표기법을 사용하여 지정됩니다. 모든 주석은 편리한 딕셔너리 형태로 해당 함수의 __annotations__ 특성에 저장됩니다. 추가 유형이 필요하지 않은 평범한 예제를 사용하여 ( typing 모듈에서 ):
def annotated(x: int, y: str) -> bool:
return x < y
annotated.__annotations__ 속성은 이제 다음과 같은 값들을 가지고 있습니다:
{'y':
만약 우리가 완전한 초보자이거나 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 설명서를 살펴보면 더 다양한 기능을 이용할 수 있다는 것을 더욱 자세히 알아볼 수 있습니다.
스텁 파일:
스텁 파일은 상호 배타적이지 않은 두 가지 다른 케이스에서 사용될 수 있습니다.
함수 서명을 직접 수정하고 싶지 않은 모듈에 대해 타입 체크를 해야합니다.
모듈을 작성하고 형식 확인을 원하지만 주석을 내용에서 분리하려고 합니다.
스텁 파일(.pyi)이란 당신이 만들고 싶거나 사용하고자 하는 모듈의 주석이 포함된 인터페이스입니다. 함수의 서명은 유형 확인을 원하는 함수를 포함하며, 함수의 본문은 폐기됩니다. 예를 들어, 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)
우리는 원한다면 제한을 둘 수 있는 단조 파일 randfunc.pyi 을 생성할 수 있습니다. 그러나 단조 파일 없이 소스를 보는 사람은 어떤 것이 어디에 전달되어야 하는지 이해하려고 노력할 때 어노테이션 지원을 받지 못할 수 있습니다.
어쨌든, 스터브 파일의 구조는 꽤 간단합니다. 빈 바디 ( int 로 채워진)를 가진 모든 함수 정의를 추가하고 요구 사항에 따라 어노테이션을 제공합니다. 여기서는 우리가 우리의 컨테이너에서 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
$###@#*@$& 함수는 주석을 다른 파일에서 사용하는 이유를 나타내며, 어떤 경우에는 코드를 혼란스럽게 하고 가독성을 낮출 수 있습니다 (파이썬에서는 큰 문제점입니다). 물론 유형 별칭을 사용할 수 있지만, 때로는 도움보다 더 혼란스러울 수 있기 때문에 현명하게 사용해야 합니다.
이것은 파이썬에서 타입 힌트의 기본 개념에 익숙해지도록 도와줄 것입니다. 사용된 타입 체커가 어렵더라도 ($#!^!$*^$&) gradually하게 더 많은 것들이 등장하는 것을 볼 수 있을 것입니다. 일부는 IDE 내부에서 ( PyCharm, ) 다른 것은 표준 파이썬 모듈로 사용됩니다.
나는 그들을 찾거나 제안된 경우 추가적인 체커/관련 패키지를 아래 목록에 추가하려고 노력할 것입니다.
내가 아는 체크어는:
Mypy : 여기에서 설명한 대로입니다.
PyType : Google에 의해, 내가 이해하는 것과 다른 표기법을 사용합니다. 아마도 확인할 가치가 있다고 생각합니다.
관련 패키지/프로젝트:
typeshed: 표준 라이브러리에 대한 스텁 파일 모음을 보유하는 공식 파이썬 저장소입니다.
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: ...
Where _T = TypeVar('_T') is used to define generic classes. 우리는 Counter 클래스에서 볼 수 있듯, 이 클래스는 초기화자에서 인자를 받지 않거나 임의의 타입을 Mapping 로 바꾸는 것이 가능하며, 임의의 타입을 인자로 받을 수 있습니다.
알림: 말을 놓치고 말았는데, typing 모듈이 임시로 도입되었다는 것을 말씀드리지 않았습니다. PEP 411 에서.
임시 패키지는 안정 상태로 졸업되기 이전에 API가 수정될 수 있습니다. 이 상태는 한편으로 패키지가 공식적으로 Python 배포판의 일부가 되어 혜택을 누리게합니다. 다른 한편으로, 핵심 개발팀은 패키지의 API 안정성을 보장하지 않으며 다음 릴리스에서 변경될 수 있음을 명시적으로 언급합니다. 이러한 패키지는 API 또는 유지 관리와 관련된 문제가 충분히 입증되면 예고 기간없이 표준 라이브러리에서 제거 될 수도 있습니다. 미래에 패키지 API가 변경되는 것은 불확실하지만 이러한 패키지가 제거되는 경우는 드뭅니다.
그러니 이것들을 겨우 농도 조절한 소금처럼 받아들이세요. 적지 않은 변화와 함께 이것들이 제거될지, 수정될지는 의심스럽지만, 누구도 확신할 수는 없습니다.
전혀 다른 주제이지만 형식 힌트의 범위 내에서 유효한 것은 PEP 526: Syntax for Variable Annotations 입니다. 이는 사용자가 간단한 varname: type 문장에서 변수의 유형에 주석을 달 수있는 새로운 구문을 도입하여 # type 주석을 대체하려는 시도입니다.
이들에 대한 간단한 소개는 이전에 언급한 것처럼, What are variable annotations?를 참조하세요.
답변 2
파이썬 3.5의 타입 힌트란 무엇인가?파이썬 3.5에서 새로운 기능으로 소개된 타입 힌트(Type Hints)는 파이썬 프로그래머들에게 큰 변화를 가져왔습니다. 이 기능은 Python 3.5에서 새로운 PEP 484 문서를 통해 소개되었으며, 파이썬 인터프리터에 타입 어노테이션을 사용할 수 있게끔 허용합니다.
타입 힌트가 하는 일은 상당히 간단합니다. 타입 힌트를 사용하면 함수의 파라미터와 반환값을 어노테이션으로 지정하여 이 함수의 반환값과 매개변수의 형태를 명시적으로 표시할 수 있습니다. 이렇게 지정된 타입 힌트는 코드를 읽는 사람이 함수에서 사용되는 각 매개변수와 반환값에 대해 어떤 타입을 기대할 수 있는지를 알 수 있게 해 줍니다.
타입 힌트를 사용하면 코드 가독성을 높이는 데 큰 도움을 줄 수 있습니다. 파이썬은 동적 타입의 언어이므로, 매개변수나 반환값이 어떤 타입인지 명시적으로 정해지지 않기 때문입니다. 이로 인해 코드를 이해하기 어려운 경우가 발생할 수 있습니다. 타입 힌트를 사용하면 이러한 문제를 해결할 수 있습니다.
타입 힌트를 사용하는 것은 강제 사항은 아닙니다. 프로그래머는 타입 힌트를 사용하지 않아도 된다는 선택권이 있습니다. 그러나 타입 힌트를 사용하면 함수의 파라미터와 반환값을 명시적으로 정의할 수 있게 되므로, 코드를 개발하고 유지보수하는 데 도움이 됩니다.
Python 3.5에서 타입 힌트를 사용하려면, typing 모듈을 import하여 사용해야 합니다. typing 모듈은 다양한 자료형과 함수 등을 제공합니다. 이 모듈을 사용하면 다음과 같은 타입 힌트를 작성할 수 있습니다.
def my_function(x: int, y: str) -> float:
return x + y
위의 코드에서, x는 int형 변수, y는 str형 변수, 반환값은 float형 변수로 지정됩니다. 이렇게 지정된 타입 힌트로 작성된 코드를 실행하면, 타입 오류가 발생할 경우 해당 오류 메시지를 확인할 수 있습니다.
타입 힌트는 코드 가독성을 높이고, 코드를 개발하고 유지보수하는 데 도움이 되는 기능입니다. 파이썬 프로그래머들은 타입 힌트를 적극적으로 사용하여 코드 가독성을 높이고, 개발 생산성을 높일 수 있습니다.