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?


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)

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.