Chú thích kiểu trả về void trong Python


108

Trong python 3.x, thông thường sử dụng chú thích kiểu trả về của một hàm, chẳng hạn như:

def foo() -> str:
    return "bar"

Chú thích chính xác cho loại "void" là gì?

Tôi đang cân nhắc 3 lựa chọn:

  1. def foo() -> None:
    • không logic IMO, vì Nonekhông phải là một loại,
  2. def foo() -> type(None):
    • sử dụng cú pháp tốt nhất mà tôi biết để lấy NoneType,
  3. def foo():
    • bỏ qua thông tin loại trả lại rõ ràng.

Tùy chọn 2. có vẻ hợp lý nhất đối với tôi, nhưng tôi đã thấy một số trường hợp của 1.


11
FWIW, Python không có các hàm với voidkiểu trả về. Bất kỳ hàm nào (hoặc nhánh trong một hàm) không có hàm rõ ràng returnsẽ trả về None. Tôi giả sử các OP hiểu rằng, nhận xét này chủ yếu là vì lợi ích của độc giả tương lai ...
PM 2Ring

Chà, câu hỏi này không phổ biến như "tại sao hàm của tôi trả về Không có trong Python?" (Tôi đã đưa ra câu hỏi này), vì vậy có lẽ hầu hết người đọc đã biết hành vi mặc định. Vấn đề nan giải 1 vs 2 được giải quyết trong câu trả lời. Nhưng còn 3 thì sao? Đối với "thủ tục", tôi thực sự thích tùy chọn 3 hơn, không có sự lộn xộn vô ích (sau tất cả, hàm này không trả về bất kỳ thứ gì).
Tomasz Gandor

@TomaszGandor Đồng ý. Khi một hàm hoặc một phương thức không chứa câu lệnh trả về thì không cần chỉ định kiểu trả về của nó.
Jeyekomon

Câu trả lời:


121

Đây là trực tiếp từ tài liệu PEP 484 - Loại Gợi ý :

Khi được sử dụng trong gợi ý kiểu, biểu thức Noneđược coi là tương đương với type(None).

Và, như bạn có thể thấy hầu hết các ví dụ sử dụng Nonelàm kiểu trả về.


22
Để làm rõ, hãy chọn tùy chọn 1 ở trên.
Adam Nelson

6
Còn loại NoReturn python.org/dev/peps/pep-0484/#the-noreturn-type thì sao?
asmaier

12
@asmaier theo câu hỏi này trích dẫn PEP 484 - Loại Gợi ý NoReturn được sử dụng "... để chú thích các hàm không bao giờ trả về bình thường. Ví dụ: một hàm tạo ra một ngoại lệ vô điều kiện ..."
Rodrigo Laguna

37

TLDR: Tương đương thành ngữ của voidchú thích kiểu trả về là -> None.

def foo() -> None:
    ...

Điều này phù hợp với một hàm không có returnhoặc chỉ có một returnđánh giá trần None.

def void_func():  # unannotated void function
    pass

print(void())  # None

Bỏ qua kiểu trả về không có nghĩa là không có giá trị trả về. Theo PEP 484 :

Đối với một hàm đã chọn, chú thích mặc định cho các đối số và cho kiểu trả về là Any.

Điều này có nghĩa là giá trị được coi là nhập động và hỗ trợ tĩnh bất kỳ hoạt động nào . Đó thực tế là ý nghĩa ngược lại của void.


Gợi ý nhập trong Python không yêu cầu nghiêm ngặt các kiểu thực tế. Ví dụ, chú thích có thể sử dụng chuỗi các tên loại: Union[str, int], Union[str, 'int'], 'Union[str, int]'và các biến thể khác nhau là tương đương.

Tương tự, chú thích kiểu Noneđược coi là có nghĩa là "là của NoneType". Điều này có thể được sử dụng không chỉ cho các loại trả lại, mặc dù bạn sẽ thấy nó thường xuyên nhất ở đó:

bar : None

def foo(baz: None) -> None:
    return None

Điều này cũng áp dụng cho các loại chung chung. Ví dụ: bạn có thể sử dụng Nonein Generator[int, None, None]để chỉ ra trình tạo không nhận hoặc trả về giá trị.


Mặc dù PEP 484 gợi ý điều đó Nonecó nghĩa là type(None), bạn không nên sử dụng biểu mẫu sau một cách rõ ràng. Đặc điểm kỹ thuật gợi ý loại không bao gồm bất kỳ hình thức nào type(...). Về mặt kỹ thuật, đây là một biểu thức thời gian chạy và sự hỗ trợ của nó hoàn toàn tùy thuộc vào trình kiểm tra kiểu. Các mypydự án được xem xét để loại bỏ hỗ trợ cho type(None)và loại bỏ nó từ 484 là tốt.

Hoặc có thể chúng ta nên cập nhật PEP 484 để không đề xuất rằng loại đó type(None)có giá trị và Nonelà cách viết đúng duy nhất? Nên có một - và tốt nhất là chỉ một - cách hiển nhiên để làm điều đó, v.v.

--- JukkaL, ngày 18 tháng 5 năm 2018


4
Lời cảm ơn rất lớn để giải thích lý do tại sao tùy chọn thứ 3 thực sự không phải là chức năng vô hiệu.
никта
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.