Cách chỉ định nhiều loại trả về bằng cách sử dụng gợi ý loại


205

Tôi có một hàm trong python có thể trả về a boolhoặc a list. Có cách nào để xác định loại trả về bằng cách sử dụng gợi ý loại.

Ví dụ, đây có phải là cách chính xác để làm điều đó?

def foo(id) -> list or bool:
      ...

5
Làm thế nào để bạn kết thúc với một danh sách hoặc boolean?
Padraic Cickyham

11
@PadraicCastyham Có lẽ việc triển khai là tôi sẽ gửi cho bạn Id của tôi, bạn gửi cho tôi một danh sách hoặc một boolean : D
Bhargav Rao

có lẽ đó là sự thực thi yếu
Sławomir Lenart

@PadraicCastyham Đa hình. Nếu hàm của bạn thực hiện kiểm tra đầu vào, bất kể đó là gì, bạn muốn lấy boolean khi bạn cung cấp một biến hoặc nhận danh sách booleans khi bạn cung cấp danh sách các biến.
Hướng dẫn

Câu trả lời:


282

Từ tài liệu

lớp học typing.Union

Loại liên minh; Liên minh [X, Y] có nghĩa là X hoặc Y.

Do đó cách thích hợp để biểu thị nhiều loại dữ liệu trả về là

from typing import Union


def foo(client_id: str) -> Union[list,bool]

Nhưng lưu ý rằng gõ không được thực thi. Python tiếp tục là một ngôn ngữ được gõ động. Cú pháp chú thích đã được phát triển để giúp đỡ trong quá trình phát triển mã trước khi được phát hành vào sản xuất. Như PEP 484 tuyên bố, "không có kiểm tra kiểu nào xảy ra trong thời gian chạy."

>>> def foo(a:str) -> list:
...     return("Works")
... 
>>> foo(1)
'Works'

Như bạn có thể thấy tôi đang truyền một giá trị int và trả về một str. Tuy nhiên, __annotations__sẽ được đặt thành các giá trị tương ứng.

>>> foo.__annotations__ 
{'return': <class 'list'>, 'a': <class 'str'>}

Vui lòng xem qua PEP 483 để biết thêm về gợi ý Loại. Xem thêm Gợi ý loại trong Python 3.5 là gì?

Vui lòng lưu ý rằng điều này chỉ có sẵn cho Python 3.5 trở lên. Điều này được đề cập rõ ràng trong PEP 484 .


Có tương đương trong Python 3,4
Yahya Uddin

1
@YahyaUddin Nope - PEP 484 : '(.... Nó chỉ cho Python3.5 trở lên.
Bhargav Rao

1
@YahyaUddin Khá ngạc nhiên. Bạn có nghĩa là chú thích chức năng bởi bất kỳ cơ hội?
Bhargav Rao

2
Vì vậy, hãy để tôi xem nếu tôi có được điều này. Python 3.4 có các chú thích chức năng không làm gì khác ngoài chú thích KHÔNG được thi hành. Nhưng trong Python 3.5, đây là loại kiểm tra thực tế.
Yahya Uddin

1
@BhargavRao, xin lỗi về điều đó! Tôi chỉ cảm thấy nó quá quan trọng để lại trong phần bình luận.
Bobort

26

Tuyên bố def foo(client_id: str) -> list or bool:khi được đánh giá là tương đương def foo(client_id: str) -> list:và do đó sẽ không làm những gì bạn muốn.

Cách riêng để mô tả gợi ý loại "A hoặc B" là Liên minh (nhờ Bhargav Rao):

def foo(client_id: str) -> Union[list, bool]:

Tôi không muốn trở thành anh chàng "Tại sao bạn lại muốn làm điều này", nhưng có lẽ có 2 loại trả về không phải là điều bạn muốn:

Nếu bạn muốn trả về một bool để chỉ ra một số trường hợp lỗi đặc biệt, hãy xem xét sử dụng Ngoại lệ thay thế. Nếu bạn muốn trả về một bool như một giá trị đặc biệt, có thể một danh sách trống sẽ là một đại diện tốt. Bạn cũng có thể chỉ ra rằng Nonecó thể được trả lại vớiOptional[list]


6
Có những cách sử dụng trong đó trả về nhiều loại có thể là những gì bạn muốn: ví dụ: nếu bạn cần trả về một trong số các kiểu con, nhưng không phải là các kiểu con khác, hoặc nếu bạn đang cố xử lý dữ liệu và muốn trả về dạng thô nếu xử lý không Không có sẵn. Ngoài ra, nếu bạn đang bọc mã kế thừa, nó có thể khá hữu ích, bởi vì nó giúp quá trình nâng cấp và / hoặc nhìn thấy những chỗ khó xử.
Nathaniel Ford

Các ngoại lệ và ý tưởng danh sách trống cũng hữu ích. cảm ơn
Yahya Uddin

20

Trong trường hợp bất kỳ ai hạ cánh ở đây để tìm kiếm "cách chỉ định loại nhiều giá trị trả về?", Hãy sử dụng Tuple[type_value1, ..., type_valueN]

from typing import Tuple

def f() -> Tuple[dict, str]:
    a = {1: 2}
    b = "hello"
    return a, b

Thông tin thêm: https://code-examples.net/vi/q/2651e60

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.