วิธีระบุประเภทการคืนสินค้าหลายประเภทโดยใช้คำใบ้ประเภท


204

ฉันมีฟังก์ชั่นในหลามที่สามารถกลับมาได้หรือbool listมีวิธีการระบุประเภทการคืนสินค้าโดยใช้คำใบ้ประเภทหรือไม่

ตัวอย่างเช่นนี่เป็นวิธีที่ถูกต้องหรือไม่

def foo(id) -> list or bool:
      ...

5
คุณจะจบลงด้วยรายการหรือบูลีนได้อย่างไร
Padraic Cunningham

11
@PadraicCunningham บางทีการใช้งานคือฉันจะส่ง ID ของฉันมาให้คุณคุณส่งรายการหรือบูลีนให้ฉัน : D
Bhargav Rao

อาจเป็นการใช้งานที่อ่อนแอ
Sławomir Lenart

@PadraicCunningham Polymorphism หากฟังก์ชันของคุณทำการตรวจสอบอินพุตสิ่งที่คุณต้องการรับบูลีนเมื่อคุณป้อนหนึ่งตัวแปรหรือรับรายการบูลีนเมื่อคุณป้อนรายการตัวแปร
Guimoute

คำตอบ:


281

จากเอกสารประกอบ

ชั้น typing.Union

ประเภทสหภาพ; ยูเนี่ยน [X, Y] หมายถึง X หรือ Y

ดังนั้นวิธีที่เหมาะสมในการแสดงชนิดข้อมูลส่งคืนมากกว่าหนึ่งประเภทคือ

from typing import Union


def foo(client_id: str) -> Union[list,bool]

แต่โปรดทราบว่าการพิมพ์ไม่ได้ถูกบังคับใช้ Python ยังคงเป็นภาษาที่พิมพ์แบบไดนามิก ไวยากรณ์คำอธิบายประกอบได้รับการพัฒนาขึ้นเพื่อช่วยในระหว่างการพัฒนาโค้ดก่อนที่จะเผยแพร่สู่การผลิต ในฐานะ PEP 484 กล่าวว่า "ไม่มีการตรวจสอบประเภทเกิดขึ้นขณะใช้งานจริง"

>>> def foo(a:str) -> list:
...     return("Works")
... 
>>> foo(1)
'Works'

อย่างที่คุณเห็นฉันกำลังผ่านค่า int และคืนค่า str อย่างไรก็ตาม__annotations__จะถูกตั้งค่าเป็นค่าที่เกี่ยวข้อง

>>> foo.__annotations__ 
{'return': <class 'list'>, 'a': <class 'str'>}

โปรดไปที่PEP 483เพื่อดูคำแนะนำเพิ่มเติมเกี่ยวกับประเภท ดูเพิ่มเติมคำใบ้ประเภทใน Python 3.5คืออะไร

โปรดทราบว่าสิ่งนี้มีให้สำหรับPython 3.5ขึ้นไปเท่านั้น นี้เป็นที่กล่าวถึงอย่างชัดเจนในPEP 484


มีค่าเท่ากันใน Python 3.4
Yahya Uddin

1
@YahyaUddin Nope - PEP 484 : '(.... เฉพาะ Python3.5 ขึ้นไปเท่านั้น
Bhargav Rao

1
@ YahyaUddin ค่อนข้างประหลาดใจ คุณหมายถึงคำอธิบายประกอบของฟังก์ชั่นโดยบังเอิญหรือไม่?
Bhargav Rao

2
ขอผมดูหน่อยถ้าผมได้อันนี้ Python 3.4 มีหมายเหตุประกอบฟังก์ชันที่ไม่ได้ทำอะไรนอกเหนือจากคำอธิบายประกอบที่ไม่ได้บังคับใช้ แต่ใน Python 3.5 นี่เป็นการตรวจสอบประเภทจริง
Yahya Uddin

1
@ BhargavRao ขอโทษด้วย! ฉันแค่รู้สึกว่ามันสำคัญเกินกว่าที่จะแสดงในส่วนความคิดเห็น
Bobort

26

คำแถลงdef foo(client_id: str) -> list or bool:เมื่อประเมินมีค่าเท่ากับ def foo(client_id: str) -> list:และจะไม่ทำสิ่งที่คุณต้องการ

วิธีดั้งเดิมในการอธิบายคำใบ้ประเภท "A หรือ B" คือการรวมกัน (ขอบคุณ Bhargav Rao):

def foo(client_id: str) -> Union[list, bool]:

ฉันไม่ต้องการที่จะเป็น "ทำไมคุณต้องการทำเช่นนี้ต่อไป" คนที่แต่งตัวประหลาด แต่อาจมี 2 ประเภทที่กลับมาไม่ใช่สิ่งที่คุณต้องการ:

หากคุณต้องการส่งคืนบูลเพื่อระบุข้อผิดพลาดพิเศษบางประเภทให้พิจารณาใช้ข้อยกเว้นแทน ถ้าคุณต้องการคืนค่าบูลเป็นค่าพิเศษบางทีรายการว่างอาจเป็นการแสดงที่ดี คุณยังสามารถระบุได้ว่าNoneสามารถส่งคืนได้ด้วยOptional[list]


6
มีการใช้งานที่การส่งคืนหลายชนิดอาจเป็นสิ่งที่คุณต้องการ: ตัวอย่างเช่นหากคุณต้องการส่งคืนชุดย่อยหนึ่งชุด แต่ไม่ใช่ประเภทย่อยอื่น ๆ หรือหากคุณพยายามประมวลผลข้อมูลและต้องการส่งคืนฟอร์มดิบหากการประมวลผลไม่ ไม่มีให้ นอกจากนี้หากคุณกำลังห่อรหัสดั้งเดิมมันมีประโยชน์มากเพราะช่วยให้กระบวนการอัปเกรดและ / หรือดูสถานที่ที่น่าอึดอัดใจ
นาธาเนียลฟอร์ด

ข้อยกเว้นและแนวคิดรายการว่างเปล่าก็มีประโยชน์เช่นกัน ขอบคุณ
Yahya Uddin

20

ในกรณีที่ทุกคนลงจอดที่นี่เพื่อค้นหา "วิธีระบุชนิดของค่าส่งคืนหลายรายการ" ให้ใช้ Tuple[type_value1, ..., type_valueN]

from typing import Tuple

def f() -> Tuple[dict, str]:
    a = {1: 2}
    b = "hello"
    return a, b

ข้อมูลเพิ่มเติม: https://code-examples.net/en/q/2651e60

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