Programing

옵션 유형 힌트를 어떻게 사용해야 하는가?

c10106 2022. 3. 27. 13:31
반응형

옵션 유형 힌트를 어떻게 사용해야 하는가?

나는 어떻게 사용하는지 이해하려고 노력하고 있다.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반면, 물체dicta이다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.

mypy 타이핑 모듈 문서에서 직접.

  • "선택은 유니온[스트]의 속기나 가명일 뿐이다.기능서명이 조금 더 깨끗해 보이도록 도와주는 편의성으로 주로 존재한다."

합격된 답은 정답이지만, 한 가지 더 유의할 점은 의 맥락에서 두 가지 모두라는 점이다.Optional[...]그리고Union[..., None]불필요하고 불필요하다.만약 당신이 즉시 에 대한 당신의 태도를 바꿀거라면None, 그러면 둘 다mypyIDE는 명확하고 자동으로 arg를 다음과 같이 처리한다.Optional[...].

IDE:

여기에 이미지 설명을 입력하십시오.

mypy:

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

반응형