옵션 유형 힌트를 어떻게 사용해야 하는가?
나는 어떻게 사용하는지 이해하려고 노력하고 있다.Optional
힌트를 타이프하다PEP-484에서, 나는 내가 사용할 수 있다는 것을 안다.Optional
을 위해def test(a: int = None)
로서든def test(a: Union[int, None])
또는def test(a: Optional[int])
.
하지만 다음과 같은 예를 들어보는 것은 어떨까?
def test(a : dict = None):
#print(a) ==> {'a': 1234}
#or
#print(a) ==> None
def test(a : list = None):
#print(a) ==> [1,2,3,4, 'a', 'b']
#or
#print(a) ==> None
만약Optional[type]
와 같은 뜻인 것 같다Union[type, None]
, 왜 내가 사용해야 하는가Optional[]
전혀?
Optional[...]
의 속기법이다.Union[..., None]
, 형식 검사기에 특정 유형의 개체가 필요하다고 말하거나 None
필수 사항. ...
복합체 유형 또는 a를 포함한 모든 유효한 유형의 힌트를 나타낸다.Union[]
더 많은 종류의기본값으로 키워드 인수가 있을 때마다None
, 당신은 사용해야만 한다.Optional
. (참고:Python 3.10 이상을 대상으로 하는 경우, PEP 604에서 더 나은 구문을 도입하였다(아래 참조).
그래서 당신의 두 가지 예시를 위해,dict
그리고list
컨테이너 유형(기본값)a
키워드 인수를 통해None
사용도 허용된다.Optional[...]
:
from typing import Optional
def test(a: Optional[dict] = None) -> None:
#print(a) ==> {'a': 1234}
#or
#print(a) ==> None
def test(a: Optional[list] = None) -> None:
#print(a) ==> [1, 2, 3, 4, 'a', 'b']
#or
#print(a) ==> None
기술적으로는 사용과 차이가 없다.Optional[]
에서Union[]
또는 그냥 추가None
에게Union[]
그래서.Optional[Union[str, int]]
그리고Union[str, int, None]
정확히 같은 것이다.
개인적으로, 나는 항상 사용법을 고수할 것이다.Optional[]
사용하는 키워드 인수의 유형을 설정할 때= None
기본값을 설정하기 위해, 이 문서는 그 이유를 설명한다.None
더 잘 허용된다.더구나 이삿짐을 옮기기가 편하다.Union[...]
별도의 형식 별칭으로 분할하거나 나중에 제거Optional[...]
논거가 의무화되면 파하다
예를 들어, 당신이 가지고 있다고 하자.
from typing import Optional, Union
def api_function(optional_argument: Optional[Union[str, int]] = None) -> None:
"""Frob the fooznar.
If optional_argument is given, it must be an id of the fooznar subwidget
to filter on. The id should be a string, or for backwards compatibility,
an integer is also accepted.
"""
그런 다음, 문서화는 다음 작업을 통해Union[str, int]
형식 별칭으로:
from typing import Optional, Union
# subwidget ids used to be integers, now they are strings. Support both.
SubWidgetId = Union[str, int]
def api_function(optional_argument: Optional[SubWidgetId] = None) -> None:
"""Frob the fooznar.
If optional_argument is given, it must be an id of the fooznar subwidget
to filter on. The id should be a string, or for backwards compatibility,
an integer is also accepted.
"""
리팩터를 움직여Union[]
가명으로 만드는 것은 훨씬 더 쉽게 만들어 졌다.Optional[...]
대신에 사용되었다.Union[str, int, None]
. TheNone
값은 결국 '하위젯 ID'가 아니고, 값의 일부도None
가치의 부재를 표시하기 위한 것이다.
사이드 노트:코드에서 Python 3.9 이상만 지원하지 않는 한, 어떤 유형을 포함해야 하는지 말할 수 없기 때문에 형식 암시 형식의 표준 라이브러리 컨테이너 유형을 사용하지 마십시오.그래서 대신에dict
그리고list
사용하다typing.Dict
그리고typing.List
각각,그리고 컨테이너 타입에서만 읽을 때, 당신은 어떠한 불변의 추상적인 용기 타입도 받아들일 수 있다; 리스트와 튜플은Sequence
반면, 물체dict
a이다Mapping
유형:
from typing import Mapping, Optional, Sequence, Union
def test(a: Optional[Mapping[str, int]] = None) -> None:
"""accepts an optional map with string keys and integer values"""
# print(a) ==> {'a': 1234}
# or
# print(a) ==> None
def test(a: Optional[Sequence[Union[int, str]]] = None) -> None:
"""accepts an optional sequence of integers and strings
# print(a) ==> [1, 2, 3, 4, 'a', 'b']
# or
# print(a) ==> None
Python 3.9 이상에서는 표준 용기 유형이 모두 형식 힌트에 사용할 수 있도록 업데이트되었다(PEP 585 참조).하지만, 지금 당신이 사용할 수 있는 동안dict[str, int]
또는list[Union[int, str]]
당신은 여전히 더 표현적인 것을 사용하고 싶을지도 모른다.Mapping
그리고Sequence
함수가 내용을 변경하지 않고('읽기 전용'으로 처리됨), 함수가 매핑 또는 시퀀스로 작동하는 모든 개체에서 각각 작동함을 나타내는 주석.
3.10이를 .|
조합 운영자가 유형 암시(PEP 604 참조).대신에Union[str, int]
너는 쓸 수 있다.str | int
. 다른 타입 색조 언어와 일치하여, 파이썬 3.10 이상에서 선택적 인수를 나타내는 선호되는 (그리고 보다 간결한) 방법이 현재에 있다.Type | None
예)str | None
또는list | None
.
- "선택은 유니온[스트]의 속기나 가명일 뿐이다.기능서명이 조금 더 깨끗해 보이도록 도와주는 편의성으로 주로 존재한다."
합격된 답은 정답이지만, 한 가지 더 유의할 점은 의 맥락에서 두 가지 모두라는 점이다.Optional[...]
그리고Union[..., None]
불필요하고 불필요하다.만약 당신이 즉시 에 대한 당신의 태도를 바꿀거라면None
, 그러면 둘 다mypy
IDE는 명확하고 자동으로 arg를 다음과 같이 처리한다.Optional[...]
.
IDE:
mypy:
및 변 수 있는 방법/기기의 경우,Optional[...]
그러나 여전히 필요한 것은 다음과 같이.mypy
그런 경우에는 자동적으로 어떤 것을 가정할 수 없다.
Python 3.9까지는 무효화 값을 힌트하려면 다음과 같은 두 가지 옵션이 있었다.
import typing
def foo(bar: typing.Optional[str]):
....
def foo(bar: typing.Union[str, None]):
....
Python 3.9에서는 타이핑 모듈을 사용하지 않아도 된다.
def foo(bar: str = None):
....
참조URL: https://stackoverflow.com/questions/51710037/how-should-i-use-the-optional-type-hint
'Programing' 카테고리의 다른 글
Vuex의 getter에 매개 변수를 전달하다 (0) | 2022.03.27 |
---|---|
생산 시 설계 양식 검증 문제 직면 (0) | 2022.03.27 |
React with useCallback and useMemo의 재렌더 문제 (0) | 2022.03.27 |
Python 3.x에서 목록을 반환하는 맵() 가져오기 (0) | 2022.03.27 |
Vue/Vuetify - 알 수 없는 사용자 지정 요소: - 구성 요소를 올바르게 등록하셨습니까? (0) | 2022.03.27 |