Nametuple'da ipuçları yazın


127

Aşağıdaki kod parçasını düşünün:

from collections import namedtuple
point = namedtuple("Point", ("x:int", "y:int"))

Yukarıdaki Kod, neyi başarmaya çalıştığımı göstermenin bir yoludur. namedtupleTip ipuçları ile yapmak istiyorum .

İstendiği gibi sonuç elde etmenin zarif bir yolunu biliyor musunuz?


2
Ayrıca, py3.7 ile başlayarak veri sınıfı seçeneğine sahipsiniz
JohnE

Yanıtlar:


151

3.6'dan beri yazılı bir adlandırılmış tuple için tercih edilen Sözdizimi

from typing import NamedTuple

class Point(NamedTuple):
    x: int
    y: int = 1  # Set default value

Point(3)  # -> Point(x=3, y=1)

Düzenleme Python 3.7 Başlarken, kullanmayı düşünün dataclasses(IDE'niz henüz statik tür denetimi için bunları desteklemeyebilir):

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int = 1  # Set default value

Point(3)  # -> Point(x=3, y=1)

12
@JohnE; OP, özellikle adlandırılmış tuples istedi. Evet, adlandırılmış demetlerin birçok kullanım durumu, veri sınıfları tarafından daha iyi sunulacaktır. Ama mükemmel Why not namedtuples'dan alıntı yapacak olursak : Eğer isimlerden oluşan bir demet istiyorsanız, adlandırılmış bir çift için gidin
Wolfgang Kuehn

1
Veri sınıflarını kullanarak, ortaya çıkan nesneyi bir Tuple gibi yapısızlaştırmak mümkün değildir
VARAK

6
Bir demet değişmezdir. Veri sınıfı (varsayılan olarak) değildir. Tuple davranışına yaklaşan donmuş bayrağı vardır. Dikkat etmemiz gereken birşey.
shao.lo

103

Kullanabilirsiniz typing.NamedTuple

Dokümanlardan

Versiyon Yazılan arasında namedtuple.

>>> import typing
>>> Point = typing.NamedTuple("Point", [('x', int), ('y', int)])

Bu sadece Python 3.5 ve sonrasında mevcuttur


Ben böyle ilan: GeoPoint = NamedTuple('GeoPoint', [('longitude', float), ('latitude', float)])o zaman ben denemek jeo = GeoPoint (** verileri) veri gerekli anahtarlar ve değerler olmak içeren dict nerede decimal.Decimalve şamandıraya hiçbir dökme olur; (hayır typerror ya :( :( yani bu nasıl typing.NamedTupleçalışır görüyor musunuz? Özünü .github.com / andilabs / 15002176b2bda786b9037077fa06cc71
andilabs

8
@andi yazarak değişkenleri zorlamaz veya atmaz afaik.
Bhargav Rao
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.