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 Nonebạ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, Optionallà 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 Xhoặ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ã Optionalvà 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, Optionallà 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ụngNonetrong vòng một loại chú thích luôn đối xử như là tương đương vớitype(None). (typingTài liệu này thực sự sử dụngNonetrong 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).