วิธีใส่คำอธิบายประกอบประเภทของค่าที่ส่งคืนหลายค่า


113

ฉันจะใช้คำแนะนำประเภทเพื่อใส่คำอธิบายประกอบฟังก์ชันที่ส่งคืนค่าIterableที่ให้ค่าสองค่าเสมอ: a boolและ a ได้strอย่างไร คำใบ้Tuple[bool, str]อยู่ใกล้ยกเว้นว่าจะ จำกัด ประเภทค่าส่งคืนเป็นทูเปิลไม่ใช่ตัวสร้างหรือประเภทอื่นที่ทำซ้ำได้

ส่วนใหญ่ฉันสงสัยเพราะฉันต้องการใส่คำอธิบายประกอบฟังก์ชันfoo()ที่ใช้ในการคืนค่าหลายค่าเช่นนี้:

always_a_bool, always_a_str = foo()

โดยปกติจะทำหน้าที่เช่นfoo()do something like return a, b(ซึ่งส่งคืน tuple) แต่ฉันต้องการให้คำใบ้ประเภทมีความยืดหยุ่นพอที่จะแทนที่ tuple ที่ส่งคืนด้วยเครื่องกำเนิดไฟฟ้าหรือรายการหรืออย่างอื่น



3
@ StevenM.Vascellaro นี่ไม่ใช่คำถามที่ซ้ำกัน
TWR Cole

คำตอบ:


160

คุณส่งคืนวัตถุหนึ่งชิ้นเสมอ ใช้return one, twoเพียงแค่ส่งคืนทูเพิล

ใช่-> Tuple[bool, str]ถูกต้องทั้งหมด

เฉพาะTupleประเภทเท่านั้นที่ให้คุณระบุจำนวนองค์ประกอบคงที่โดยแต่ละประเภทจะมีประเภทที่แตกต่างกัน คุณควรส่งคืนทูเปิลเสมอหากฟังก์ชันของคุณสร้างค่าที่ส่งคืนเป็นจำนวนคงที่โดยเฉพาะอย่างยิ่งเมื่อค่าเหล่านั้นเป็นค่าเฉพาะและประเภทที่แตกต่างกัน

ประเภทลำดับอื่น ๆ คาดว่าจะมีข้อกำหนดประเภทเดียวสำหรับจำนวนองค์ประกอบที่แปรผันดังนั้นจึงtyping.Sequenceไม่เหมาะ ดูความแตกต่างระหว่างรายการและสิ่งที่เพิ่มขึ้น

ทูเปิลเป็นโครงสร้างข้อมูลที่ต่างกัน (กล่าวคือรายการมีความหมายต่างกัน) ในขณะที่รายการเป็นลำดับที่เป็นเนื้อเดียวกัน Tuples มีโครงสร้างรายการมีลำดับ

ระบบคำใบ้ประเภทของ Python เป็นไปตามปรัชญาดังกล่าวปัจจุบันไม่มีไวยากรณ์ที่ระบุความยาวคงที่ที่สามารถทำซ้ำได้และมีประเภทเฉพาะที่ตำแหน่งเฉพาะ

หากคุณต้องระบุว่าจะทำซ้ำได้สิ่งที่ดีที่สุดที่คุณสามารถทำได้คือ:

-> Iterable[Union[bool, str]]

ณ จุดใดผู้เรียกสามารถคาดหวังบูลีนและสตริงในลำดับใดก็ได้และมีความยาวที่ไม่ทราบสาเหตุ


2
ข้อกำหนดภาษาช่วยให้กลับมา iterables อื่น ๆ foo()สามารถทำได้yield True; yield "blah"และa, b = foo()ยังคงใช้งานได้ หรือfoo()อาจส่งคืนรายการ ฉันตั้งคำถามใหม่เพื่อให้ชัดเจนว่าฉันสนใจที่จะบอกใบ้ว่าสามารถทำซ้ำได้โดยพลการ
Richard Hansen

2
@RichardHansen: ฉันตรวจสอบ PEP และเอกสารของอีกครั้งtypingและmypyอีก 2 ครั้งนับตั้งแต่โพสต์ ฉันค่อนข้างมั่นใจว่าฉันไม่พลาดอะไรเลย ที่กล่าวว่ามีขาประจำหลายคนที่นี่ใน SO พร้อมประสบการณ์การบอกใบ้ประเภท Python มากมายที่จะไม่ลังเลที่จะแก้ไขฉันหากปรากฎว่าผิดหรือจะโพสต์คำตอบที่ดีกว่า
Martijn Pieters

21
ฉันต้องเพิ่มfrom typing import Tupleเพื่อให้คำอธิบายประกอบ Tuple ทำงานได้
PHPirate

3
@PHPirate: ใช่และคุณต้องทำเช่นเดียวกันสำหรับIterableและUnion. เนื่องจากเรากำลังพูดถึงการใช้งานเฉพาะของพวกเขาที่นี่จึงมีการกล่าวโดยนัย
Martijn Pieters

6
@MartijnPieters ขอบคุณสำหรับคำตอบที่ดี แต่ฉันคิดว่าความคิดเห็นของ PHPirate คุ้มค่าที่จะแก้ไขเป็นคำตอบเดิมของคุณ
Tim Mironov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.