programing

TypeVar와 NewType의 차이점은 무엇입니까?

jooyons 2023. 8. 28. 21:01
반응형

TypeVar와 NewType의 차이점은 무엇입니까?

TypeVar 관련이 있는 것처럼 보이지만, 언제 각각을 사용해야 하는지 또는 런타임과 정적으로 어떤 차이가 있는지 잘 모르겠습니다.

두 개념은 다른 유형과 관련된 개념보다 더 이상 관련이 없습니다.

요컨대, a.TypeVar형식 서명에서 사용할 수 있는 변수이므로 지정되지 않은 동일한 형식을 두 번 이상 참조할 수 있습니다.NewType일부 값을 고유한 유형으로 처리해야 함을 유형 검사기에 알리는 데 사용됩니다.

유형 변수

단순화하려면 유형 변수를 사용하여 동일한 유형을 정확하게 지정하지 않고 두 번 이상 참조할 수 있습니다.

정의에서 단일 유형 변수는 항상 동일한 값을 사용합니다.

# (This code will type check, but it won't run.)
from typing import TypeVar, Generic, List, Tuple

# Two type variables, named T and R
T = TypeVar('T')
R = TypeVar('R')

# Put in a list of Ts and get out one T
def get_one(x: List[T]) -> T: ...

# Put in a T and an R, get back an R and a T
def swap(x: T, y: R) -> Tuple[R, T]:
    return y, x

# A simple generic class that holds a value of type T
class ValueHolder(Generic[T]):
    def __init__(self, value: T):
        self.value = value
    def get(self) -> T:
        return self.value

x: ValueHolder[int] = ValueHolder(123)
y: ValueHolder[str] = ValueHolder('abc')

유형 변수가 없으면 다음 유형을 선언할 수 있는 좋은 방법이 없습니다.get_one또는ValueHolder.get.

몇 가지 다른 옵션이 있습니다.TypeVar더 많은 유형을 전달하여 가능한 값을 제한할 수 있습니다(예:TypeVar(name, int, str)) 또는 상한을 지정하여 유형 변수의 모든 값이 해당 유형의 하위 유형이어야 합니다(예:TypeVar(name, bound=int)).

또한 유형 변수를 선언할 때 유형 변수가 공변량인지 반변량인지 또는 둘 다인지 여부를 결정할 수 있습니다.이는 기본적으로 일반 유형 대신 하위 클래스 또는 상위 클래스를 사용할 수 있는 시기를 결정합니다.PEP 484에서는 이러한 개념에 대해 자세히 설명하고 추가 리소스를 참조합니다.

뉴타입

A NewType새 유형을 만드는 작업을 실제로 수행하지 않고 고유한 유형을 선언하거나 새 클래스 인스턴스를 만드는 데 따른 오버헤드를 걱정할 때 사용합니다.

유형 검사기에서NewType('Name', int)의 하위 클래스를 만듭니다.int이름이 "이름"입니다.

런타임에,NewType('Name', int)클래스가 전혀 아닙니다; 그것은 실제로 정체성 함수입니다, 그래서x is NewType('Name', int)(x)항상 진실입니다.

from typing import NewType

UserId = NewType('UserId', int)

def get_user(x: UserId): ...

get_user(UserId(123456)) # this is fine
get_user(123456) # that's an int, not a UserId

UserId(123456) + 123456 # fine, because UserId is a subclass of int

유형 검사기에,UserId다음과 같이 보입니다.

class UserId(int): pass

하지만 런타임에UserId기본적으로 다음과 같습니다.

def UserId(x): return x

그 이상의 것은 거의 없습니다.NewType런타임에Python 3.8.1을 기준으로 구현은 거의 정확하게 다음과 같습니다.

def NewType(name, type_):
    def identity(x):
        return x
    identity.__name__ = name
    return identity

언급URL : https://stackoverflow.com/questions/58755948/what-is-the-difference-between-typevar-and-newtype

반응형