it-source

명명된 튜플과 명명된 튜플의 차이점은 무엇입니까?튜플?

criticalcode 2023. 5. 26. 21:07
반응형

명명된 튜플과 명명된 튜플의 차이점은 무엇입니까?튜플?

모듈 설명서에는 아래의 두 코드 스니펫이 동일하다고 나와 있습니다.

from typing import NamedTuple

class Employee(NamedTuple):
    name: str
    id: int

그리고.

from collections import namedtuple

Employee = namedtuple('Employee', ['name', 'id'])

이들은 정확히 같은 것입니까, 아니면 그렇지 않은 경우 두 구현 간의 차이점은 무엇입니까?

하위 분류에 의해 생성된 유형typing.NamedTuplea와 같습니다.collections.namedtuple하지만 그와 함께__annotations__,_field_types그리고._field_defaults속성이 추가되었습니다.Python의 어떤 것도 현재 이러한 타이핑 관련 속성에 작용하지 않기 때문에 생성된 코드는 모든 실용적인 목적에서 동일하게 동작합니다(그러나 IDE는 이를 사용할 수 있습니다).

개발자로서, 사용하기typing명명된 튜플에 대한 모듈을 사용하면 보다 자연스러운 선언적 인터페이스를 사용할 수 있습니다.

  • 필드에 대한 기본값을 쉽게 지정할 수 있습니다(편집: Python 3.7에서 키워드얻었기 때문에 더 이상 이점이 아닙니다).
  • 유형 이름("직원")을 두 번 반복할 필요가 없습니다.
  • 유형을 직접 사용자 정의할 수 있습니다(예: 문서 문자열 또는 일부 메서드 추가).

이전과 같이, 당신의 클래스는 다음의 하위 클래스가 될 것입니다.tuple그리고 사례는 다음과 같은 사례가 될 것입니다.tuple평소처럼.흥미롭게도, 당신의 클래스는 다음의 하위 클래스가 아닐 것입니다.NamedTuple그 이유를 알고 싶다면 구현 세부 정보에 대한 자세한 내용을 참조하십시오.

from typing import NamedTuple

class Employee(NamedTuple):
    name: str
    id: int

Python <= 3.8에서의 동작

>>> issubclass(Employee, NamedTuple)
False
>>> isinstance(Employee(name='guido', id=1), NamedTuple)
False

typing.NamedTuple클래스입니다. 메타클래스와 사용자 정의를 사용합니다.__new__주석을 처리한 다음 형식을 빌드하고 반환하도록 위임합니다.소문자 표기법에서 짐작하셨겠지만,collections.namedtuple유형/클래스가 아니라 공장 기능입니다.파이썬 소스 코드 문자열을 작성한 다음 이 문자열을 호출하는 방식으로 작동합니다.생성된 생성자가 네임스페이스에서 추출되어 메타 클래스의 3-인수 호출에 포함되어 클래스를 빌드하고 반환합니다.이로써 위에서 본 이상한 상속파손이 설명되고,NamedTuple클래스 개체를 인스턴스화하기 위해 다른 메타 클래스를 사용합니다.

Python >= 3.9에서의 동작

typing.NamedTuple형식에서 변경됨(class) 함수(def)

>>> issubclass(Employee, NamedTuple)
TypeError: issubclass() arg 2 must be a class or tuple of classes
>>> isinstance(Employee(name="guido", id=1), NamedTuple)
TypeError: isinstance() arg 2 must be a type or tuple of types

메타클래스 곡예는 사라졌고, 이제는 단순한 공장 기능으로 전화를 걸었습니다.collections.namedtuple그리고 세트__annotations__반송된 활자에다음을 사용하여 다중 상속NamedTuple이제 허용되지 않습니다(애초에 제대로 작동하지 않았습니다).

변경 사항은 bpo40185 / GH-19371을 참조하십시오.

언급URL : https://stackoverflow.com/questions/50766461/whats-the-difference-between-namedtuple-and-namedtuple

반응형