วิธีระบุชนิดส่งคืน“ nullable” พร้อมคำแนะนำประเภท


177

สมมติว่าฉันมีฟังก์ชั่น:

def get_some_date(some_argument: int=None) -> %datetime_or_None%:
    if some_argument is not None and some_argument == 1:
        return datetime.utcnow()
    else:
        return None

ฉันจะระบุประเภทส่งคืนสำหรับสิ่งที่สามารถเป็นได้Noneอย่างไร

คำตอบ:


279

Optionalคุณกำลังมองหา

เนื่องจากประเภทส่งคืนของคุณอาจเป็นdatetime(กลับมาจากdatetime.utcnow()) หรือNoneคุณควรใช้Optional[datetime]:

from typing import Optional

def get_some_date(some_argument: int=None) -> Optional[datetime]:
    # as defined

จากเอกสารที่เกี่ยวกับการพิมพ์Optionalเป็นชวเลขสำหรับ:

Optional[X]Union[X, None]เทียบเท่ากับ

ซึ่งUnion[X, Y]หมายถึงค่าของชนิดหรือXY


หากคุณต้องการชัดเจนเนื่องจากความกังวลที่คนอื่นอาจสะดุดOptionalและไม่เข้าใจความหมายคุณสามารถใช้Union:

from typing import Union

def get_some_date(some_argument: int=None) -> Union[datetime, None]:

แต่ฉันสงสัยว่านี่เป็นความคิดที่ดีOptionalเป็นชื่อที่บ่งบอกและช่วยประหยัดการกดแป้นบางครั้ง

ตามที่ระบุไว้ในความคิดเห็นโดย @ Michael0x2a Union[T, None]จะถูกเปลี่ยนรูปไปUnion[T, type(None)]ดังนั้นไม่จำเป็นต้องใช้typeที่นี่

สายตาเหล่านี้อาจแตกต่างกัน แต่โดยทางโปรแกรมทั้งสองกรณีผลลัพธ์จะเหมือนกันทุกประการ Union[datetime.datetime, NoneType]จะเป็นประเภทที่เก็บไว้ในget_some_date.__annotations__* :

>>> from typing import get_type_hints
>>> print(get_type_hints(get_some_date))
{'return': typing.Union[datetime.datetime, NoneType],
 'some_argument': typing.Union[int, NoneType]}

*ใช้typing.get_type_hintsเพื่อจับคุณสมบัติของวัตถุ__annotations__แทนการเข้าถึงโดยตรง


10
คุณสามารถลดความซับซ้อนของUnion[datetime, type(None)]การUnion[datetime, None]- ตามPEP 484ใช้ภายในประเภทคำอธิบายประกอบได้รับการปฏิบัติเสมอเป็นเทียบเท่ากับNone type(None)( typingเอกสารNoneส่วนใหญ่ใช้ในกรณีส่วนใหญ่ แต่ไม่ได้อยู่ที่นี่ซึ่งเป็นการตรวจสอบ)
Michael0x2a

@ Michael0x2a ไม่รู้ว่าน่าสนใจ เพิ่มแล้ว :)
Dimitris Fasarakis Hilliard

4
ฉันไปข้างหน้าและส่งแพตช์เพื่อแก้ไขปัญหานี้ในตอนนี้ดังนั้นหวังว่าเอกสารจะสอดคล้องกันมากขึ้นในอนาคตอันใกล้นี้!
Michael0x2a

1
Optional[T]ประเภทเป็นที่รู้จักกันในชุมชนโปรแกรมการทำงาน ผู้อ่านจะไม่เพียง แต่รู้ว่ามันหมายถึงUnion[T, None]แต่จะรับรู้รูปแบบการใช้งานที่ฟังก์ชั่นจะส่งกลับไม่มีเมื่อไม่มีคำตอบที่มีความหมายมีข้อผิดพลาดหรือไม่พบผลลัพธ์
สัปดาห์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.