คำถามติดแท็ก namedtuple

11
อะไรคือ "ชื่อ tuples" ใน Python?
การอ่านการเปลี่ยนแปลงใน Python 3.1ฉันพบบางสิ่ง ... ที่ไม่คาดคิด: tuple sys.version_info เป็นtuple ชื่อ : ฉันไม่เคยได้ยินชื่อ tuples มาก่อนและฉันคิดว่าองค์ประกอบต่างๆสามารถจัดทำดัชนีโดยตัวเลข (เช่นใน tuples และรายการ) หรือโดยคีย์ (เช่นใน dicts) ฉันไม่เคยคาดหวังว่าพวกเขาจะได้รับการจัดทำดัชนีทั้งสองวิธี ดังนั้นคำถามของฉันคือ: สิ่งอันดับชื่ออะไร วิธีใช้งาน ทำไม / เมื่อใดฉันจึงควรใช้สิ่งอันดับชื่อแทนที่จะเป็นอันดับอันดับปกติ ทำไม / เมื่อใดฉันจึงควรใช้สิ่งอันดับทั่วไปแทนที่จะเป็นสิ่งอันดับ? มี "รายการที่ระบุชื่อ" (รุ่นที่ไม่แน่นอนของ tuple ที่มีชื่อ) หรือไม่?

21
namedtuple และค่าดีฟอลต์สำหรับอาร์กิวเมนต์คำหลักเพิ่มเติม
ฉันพยายามที่จะแปลงคลาส "data" ที่มีลักษณะเป็นโพรงยาวให้เป็น tuple ที่มีชื่อ ชั้นเรียนของฉันดูเหมือนว่านี้: class Node(object): def __init__(self, val, left=None, right=None): self.val = val self.left = left self.right = right หลังจากแปลงnamedtupleเป็นดูเหมือน: from collections import namedtuple Node = namedtuple('Node', 'val left right') แต่มีปัญหาอยู่ที่นี่ คลาสดั้งเดิมของฉันอนุญาตให้ฉันส่งผ่านค่าและดูแลค่าเริ่มต้นโดยใช้ค่าเริ่มต้นสำหรับอาร์กิวเมนต์ที่ระบุชื่อ / คำหลัก สิ่งที่ต้องการ: class BinaryTree(object): def __init__(self, val): self.root = Node(val) แต่สิ่งนี้ไม่ได้ผลในกรณีของ tuple ที่ชื่อว่า refactored …

11
ฉันจะหลีกเลี่ยง“ self.x = x ได้อย่างไร self.y = y; รูปแบบ self.z = z” ใน __init__?
ฉันเห็นรูปแบบที่ชอบ def __init__(self, x, y, z): ... self.x = x self.y = y self.z = z ... ค่อนข้างบ่อยบ่อยครั้งที่มีพารามิเตอร์มากขึ้น มีวิธีที่ดีในการหลีกเลี่ยงการทำซ้ำที่น่าเบื่อนี้หรือไม่? คลาสควรสืบทอดจากnamedtupleแทนหรือไม่?

6
แปลง tuple ที่มีชื่อเป็นพจนานุกรม
ฉันมีคลาส tuple ชื่อในหลาม class Town(collections.namedtuple('Town', [ 'name', 'population', 'coordinates', 'population', 'capital', 'state_bird'])): # ... ฉันต้องการแปลงอินสแตนซ์ทาวน์เป็นพจนานุกรม ฉันไม่ต้องการให้มันผูกติดอยู่กับชื่อหรือจำนวนของฟิลด์ในเมือง มีวิธีเขียนเช่นนี้หรือไม่ที่ฉันสามารถเพิ่มเขตข้อมูลเพิ่มเติมหรือส่งชื่อ tuple ที่แตกต่างไปจากเดิมอย่างสิ้นเชิงและรับพจนานุกรม ฉันไม่สามารถแก้ไขคำจำกัดความของคลาสเดิมได้ในรหัสของผู้อื่น ดังนั้นฉันต้องใช้อินสแตนซ์ของเมืองและแปลงเป็นพจนานุกรม

2
พิมพ์คำแนะนำใน namedtuple
พิจารณาโค้ดต่อไปนี้: from collections import namedtuple point = namedtuple("Point", ("x:int", "y:int")) หลักปฏิบัติข้างต้นเป็นเพียงวิธีแสดงให้เห็นว่าฉันพยายามบรรลุเป้าหมายอะไร ฉันต้องการทำnamedtupleด้วยคำแนะนำประเภท คุณรู้วิธีที่สวยงามในการบรรลุผลตามที่ตั้งใจไว้หรือไม่?

10
การมีอยู่ของทูเปิลที่ไม่เปลี่ยนชื่อใน Python?
ใครสามารถแก้ไขnametupleหรือจัดเตรียมคลาสทางเลือกเพื่อให้ทำงานกับวัตถุที่เปลี่ยนแปลงได้? เพื่อความสามารถในการอ่านเป็นหลักฉันต้องการสิ่งที่คล้ายกับ namedtuple ที่ทำสิ่งนี้: from Camelot import namedgroup Point = namedgroup('Point', ['x', 'y']) p = Point(0, 0) p.x = 10 >>> p Point(x=10, y=0) >>> p.x *= 10 Point(x=100, y=0) ต้องเป็นไปได้ที่จะดองวัตถุที่เป็นผลลัพธ์ และตามลักษณะของชื่อทูเปิลลำดับของเอาต์พุตเมื่อแสดงจะต้องตรงกับลำดับของรายการพารามิเตอร์เมื่อสร้างวัตถุ

10
การเพิ่ม docstrings ใน namedtuples?
เป็นไปได้ไหมที่จะเพิ่มสตริงเอกสารเข้ากับ namestuple อย่างง่ายดาย? ฉันเหนื่อย from collections import namedtuple Point = namedtuple("Point", ["x", "y"]) """ A point in 2D space """ # Yet another test """ A(nother) point in 2D space """ Point2 = namedtuple("Point2", ["x", "y"]) print Point.__doc__ # -> "Point(x, y)" print Point2.__doc__ # -> "Point2(x, y)" แต่นั่นไม่ได้ตัดมัน เป็นไปได้ไหมที่จะทำด้วยวิธีอื่น?

11
การต่ออนุกรม Python namedtuple เป็น json
อะไรคือวิธีที่แนะนำในการทำให้อนุกรม a namedtupleถึง json โดยที่ชื่อเขตข้อมูลยังคงอยู่ การต่ออนุกรม a namedtupleถึง json จะส่งผลให้เฉพาะค่าที่ถูกทำให้เป็นอนุกรมและชื่อเขตข้อมูลจะสูญหายไปในการแปล ฉันต้องการให้เขตข้อมูลยังคงอยู่เมื่อ json-ized และด้วยเหตุนี้: class foobar(namedtuple('f', 'foo, bar')): __slots__ = () def __iter__(self): yield self._asdict() ข้างต้นทำให้เป็นอนุกรมเป็น json ตามที่ฉันคาดหวังและทำงานเหมือนnamedtupleในที่อื่น ๆ ที่ฉันใช้ (การเข้าถึงแอตทริบิวต์ ฯลฯ ) ยกเว้นผลลัพธ์ที่ไม่ใช่ทูเพิลในขณะที่ทำซ้ำ (ซึ่งใช้ได้กับกรณีการใช้งานของฉัน) อะไรคือ "วิธีที่ถูกต้อง" ในการแปลงเป็น json โดยที่ชื่อฟิลด์ยังคงอยู่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.