Kể từ kiểu trả về của bạn, hoặc có thể datetime
(như 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, Optional
là viết tắt cho:
Optional[X]
tương đương đến Union[X, None]
.
nơi Union[X, Y]
là giá trị loại X
hoặc Y
.
Nếu bạn muốn trở thành rõ ràng do lo ngại rằng những người khác có thể vấp ngã trên Optional
và không nhận ra đó là ý nghĩa, 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ỉ dẫn và nó lưu một vài tổ hợp phím.
Như được nêu trong các nhận xét của @ Michael0x2a Union[T, None]
được chuyển thành Union[T, type(None)]
vì vậy không cần sử dụng type
tại đây.
Hình ảnh này có thể khác nhau nhưng theo chương trình, trong cả hai trường hợp, kết quả là giống hệt nhau; Union[datetime.datetime, NoneType]
sẽ là loại 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 các đối tượng __annotations__
thuộc tính thay vì truy cập trực tiếp.
Bạn có thể đơn giản hóa 'Liên minh [datetime, type (None)]' thành 'Union [datetime, None]' - theo [PEP 484] (https://www.python.org/dev/peps/pep -0484/# using-none), sử dụng 'None' trong một chú thích kiểu luôn được coi là tương đương với' type (None) '. (Tài liệu 'typing' thực sự sử dụng' None' 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). – Michael0x2a
@ Michael0x2a không biết điều đó, thú vị. Đã thêm nó :) –
Tôi đã tiếp tục và gửi [bản vá] (http://bugs.python.org/issue28073) để sửa lỗi này ngay bây giờ, vì vậy hy vọng các tài liệu sẽ nhất quán hơn về điều này trong tương lai gần! – Michael0x2a