2016-09-10 17 views

Trả lời

58

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.

+0

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

+0

@ Michael0x2a không biết điều đó, thú vị. Đã thêm nó :) –

+1

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

Các vấn đề liên quan