Ketik petunjuk dalam namapuple

127

Pertimbangkan potongan kode berikut:

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

Kode di atas hanyalah cara untuk menunjukkan apa yang saya coba capai. Saya ingin membuat namedtupledengan petunjuk tipe.

Apakah Anda tahu cara elegan untuk mencapai hasil seperti yang diinginkan?

Pavel Hanpari
sumber
2
Juga, mulai dengan py3.7 Anda memiliki opsi kelas data: docs.python.org/3/library/dataclasses.html
JohnE

Jawaban:

151

Sintaks yang lebih disukai untuk tupel bernama yang diketik sejak 3.6 adalah

from typing import NamedTuple

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

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

Edit Memulai Python 3.7, pertimbangkan untuk menggunakan dataclasses(IDE Anda mungkin belum mendukungnya untuk pemeriksaan tipe statis):

from dataclasses import dataclass

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

Point(3)  # -> Point(x=3, y=1)
Wolfgang Kuehn
sumber
12
@Tokopedia OP secara khusus meminta nama tupel. Ya, banyak kasus penggunaan tupel bernama akan lebih baik dilayani oleh kelas data. Tetapi untuk mengutip Why not Namedtuple yang sangat baik : Jika Anda menginginkan tuple dengan nama, tentu saja: pilihlah tuple bernama
Wolfgang Kuehn
1
Menggunakan dataclasses, tidak mungkin untuk mendekonstruksi objek yang dihasilkan seperti yang Anda lakukan pada Tuple
VARAK
6
Tupel tidak dapat diubah. Sebuah dataclass tidak (secara default) Ia memiliki flag beku yang mendekati perilaku tuple. Hanya sesuatu yang harus diperhatikan.
shao.lo
103

Kamu bisa memakai typing.NamedTuple

Dari dokumen

Versi yang diketik dari namedtuple.

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

Ini hanya ada di Python 3.5 dan seterusnya

Bhargav Rao
sumber
Saya menyatakannya seperti ini: GeoPoint = NamedTuple('GeoPoint', [('longitude', float), ('latitude', float)])kemudian saya mencoba geo = GeoPoint (** data) di mana data adalah dict yang berisi kunci dan nilai yang diperlukan decimal.Decimal, dan tidak ada cast to float yang terjadi; (tidak ada typerror baik :( :( jadi bagaimana ini typing.NamedTuplebekerja? Lihat intinya .github.com / andilabs / 15002176b2bda786b9037077fa06cc71
andilabs
8
Pengetikan @andi tidak memaksakan atau menampilkan variabel, afaik.
Bhargav Rao