Làm thế nào để xác định kiểu trả về của null nullable với gợi ý kiểu


177

Giả sử tôi có một chức năng:

def get_some_date(some_argument: int=None) -> %datetime_or_None%:
    if some_argument is not None and some_argument == 1:
        return datetime.utcnow()
    else:
        return None

Làm cách nào để chỉ định loại trả về cho thứ gì đó có thể None?

Câu trả lời:


279

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ới Union[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ó.


9
Bạn có thể đơn giản hóa Union[datetime, type(None)]để Union[datetime, None]- theo PEP 484 , sử dụng Nonetrong vòng một loại chú thích luôn đối xử như là tương đương với type(None). ( typingTài liệu này thực sự sử dụng Nonetrong 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ật thú vị. Đã thêm nó :)
Dimitris Fasarakis Hilliard

4
Tôi đã đi trước và gửi một bản vá để 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ề vấn đề này trong tương lai gần!
Michael0x2a

1
Các 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ả.
WKS
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.