명명된 튜플과 명명된 튜플의 차이점은 무엇입니까?튜플?
모듈 설명서에는 아래의 두 코드 스니펫이 동일하다고 나와 있습니다.
from typing import NamedTuple
class Employee(NamedTuple):
name: str
id: int
그리고.
from collections import namedtuple
Employee = namedtuple('Employee', ['name', 'id'])
이들은 정확히 같은 것입니까, 아니면 그렇지 않은 경우 두 구현 간의 차이점은 무엇입니까?
하위 분류에 의해 생성된 유형typing.NamedTuple
a와 같습니다.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
'it-source' 카테고리의 다른 글
"객체 참조가 객체의 인스턴스로 설정되지 않음"은 무엇을 의미합니까? (0) | 2023.05.26 |
---|---|
==와 동등한 값 사이의 C# 차이() (0) | 2023.05.26 |
"빌드 앤 런" 없이 아이폰 시뮬레이터를 시작할 수 있습니까? (0) | 2023.05.26 |
버튼 또는 레이블 텍스트에서 "&"(앰퍼샌드)를 표시하려면 어떻게 해야 합니까? (0) | 2023.05.26 |
Azure 사용자 지정 컨트롤러 / API.네트 백엔드 (0) | 2023.05.21 |