พิมพ์คำแนะนำใน namedtuple


127

พิจารณาโค้ดต่อไปนี้:

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

หลักปฏิบัติข้างต้นเป็นเพียงวิธีแสดงให้เห็นว่าฉันพยายามบรรลุเป้าหมายอะไร ฉันต้องการทำnamedtupleด้วยคำแนะนำประเภท

คุณรู้วิธีที่สวยงามในการบรรลุผลตามที่ตั้งใจไว้หรือไม่?


2
นอกจากนี้เริ่มต้นด้วย py3.7 คุณมีตัวเลือกdataclass
JohnE

คำตอบ:


151

ไวยากรณ์ที่ต้องการสำหรับการพิมพ์ชื่อทูเปิลตั้งแต่ 3.6 คือ

from typing import NamedTuple

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

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

แก้ไขการ เริ่มต้น Python 3.7 ให้พิจารณาใช้dataclasses(IDE ของคุณอาจยังไม่รองรับสำหรับการตรวจสอบประเภทคงที่):

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 ขอโดยเฉพาะสำหรับสิ่งที่มีชื่อ ใช่กรณีการใช้งานจำนวนมากของสิ่งที่มีชื่อจะได้รับการบริการที่ดีกว่าโดยคลาสข้อมูล แต่จะอ้างถึงสิ่งที่ยอดเยี่ยมทำไมไม่ตั้งชื่อ : ถ้าคุณต้องการทูเปิลที่มีชื่อโดยทั้งหมด: ไปที่ชื่อทูเปิล
Wolfgang Kuehn

1
การใช้ dataclasses ทำให้ไม่สามารถแยกโครงสร้างของวัตถุที่เป็นผลลัพธ์ได้เหมือนที่คุณทำได้ Tuple
VARAK

6
ทูเปิลไม่เปลี่ยนรูป dataclass ไม่ใช่ (โดยค่าเริ่มต้น) มีแฟล็กแช่แข็งซึ่งเข้าใกล้พฤติกรรมของทูเปิล เพียงสิ่งที่ควรระวัง
shao.lo

103

คุณสามารถใช้ได้ typing.NamedTuple

จากเอกสาร

เวอร์ชันที่พิมพ์ของnamedtuple.

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

สิ่งนี้มีเฉพาะใน Python 3.5 เป็นต้นไป


ฉันประกาศแบบนี้: GeoPoint = NamedTuple('GeoPoint', [('longitude', float), ('latitude', float)])จากนั้นฉันลอง geo = GeoPoint (** data) โดยที่ข้อมูลเป็นคำสั่งที่มีคีย์และค่าที่จำเป็นdecimal.Decimalและไม่มีการ cast ให้ลอยเกิดขึ้น (ไม่มี typerror ด้วย :( :( ดังนั้นวิธีการtyping.NamedTupleทำงานดูส่วนสำคัญ .github.com / andilabs / 15002176b2bda786b9037077fa06cc71
andilabs

8
@andi การพิมพ์ไม่ได้บังคับหรือส่งตัวแปร afaik
Bhargav Rao
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.