Câu trả lời:
Bạn đang tìm Optional
.
Vì loại trả về của bạn có thể là datetime
(như được trả về từ datetime.utcnow()
) hoặc None
bạn nên sử dụng Optional[datetime]
:
from typing import Optional
def get_some_date(some_argument: int=None) -> Optional[datetime]:
# as defined
Từ các tài liệu về đánh máy, Optional
là viết tắt cho:
Optional[X]
tương đương vớiUnion[X, None]
.
trong đó Union[X, Y]
có nghĩa là một giá trị của loại X
hoặc Y
.
Nếu bạn muốn rõ ràng do lo ngại rằng người khác có thể vấp ngã Optional
và không nhận ra ý nghĩa của nó, bạn luôn có thể sử dụng Union
:
from typing import Union
def get_some_date(some_argument: int=None) -> Union[datetime, None]:
Nhưng tôi nghi ngờ đây là một ý tưởng tốt, Optional
là một tên chỉ định và nó tiết kiệm một vài tổ hợp phím.
Như đã chỉ ra trong các bình luận của @ Michael0x2a Union[T, None]
là tranformed Union[T, type(None)]
nên không cần sử dụng type
ở đây.
Nhìn bề ngoài chúng có thể khác nhau nhưng theo chương trình, trong cả hai trường hợp, kết quả hoàn toàn giống nhau ; Union[datetime.datetime, NoneType]
sẽ là loại được lưu trữ trong 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]}
* Sử dụng typing.get_type_hints
để lấy __annotations__
thuộc tính của các đối tượng thay vì truy cập trực tiếp vào nó.
Optional[T]
loại nổi tiếng trong cộng đồng lập trình chức năng. Người đọc sẽ không chỉ biết rằng nó có nghĩa Union[T, None]
, mà còn nhận ra mẫu sử dụng mà hàm sẽ trả về Không khi không có câu trả lời có ý nghĩa, có lỗi hoặc không tìm thấy kết quả.
Union[datetime, type(None)]
đểUnion[datetime, None]
- theo PEP 484 , sử dụngNone
trong vòng một loại chú thích luôn đối xử như là tương đương vớitype(None)
. (typing
Tài liệu này thực sự sử dụngNone
trong hầu hết các trường hợp, nhưng không có ở đây, đây là một sự giám sát).