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__แทนการเข้าถึงโดยตรง
Union[datetime, type(None)]การUnion[datetime, None]- ตามPEP 484ใช้ภายในประเภทคำอธิบายประกอบได้รับการปฏิบัติเสมอเป็นเทียบเท่ากับNonetype(None)(typingเอกสารNoneส่วนใหญ่ใช้ในกรณีส่วนใหญ่ แต่ไม่ได้อยู่ที่นี่ซึ่งเป็นการตรวจสอบ)