Làm cách nào để chú thích các loại nhiều giá trị trả về?


107

Làm cách nào để sử dụng gợi ý kiểu để chú thích một hàm trả về một hàm Iterableluôn mang lại hai giá trị: a boolvà a str? Gợi ý Tuple[bool, str]gần giống, ngoại trừ việc nó giới hạn kiểu giá trị trả về thành một bộ giá trị, không phải là trình tạo hoặc kiểu có thể lặp lại khác.

Tôi chủ yếu tò mò vì tôi muốn chú thích một hàm foo()được sử dụng để trả về nhiều giá trị như sau:

always_a_bool, always_a_str = foo()

Thông thường các chức năng như foo()làm một cái gì đó như return a, b(trả về một tuple), nhưng tôi muốn gợi ý kiểu đủ linh hoạt để thay thế tuple được trả về bằng một trình tạo hoặc danh sách hoặc một cái gì đó khác.



3
@ StevenM.Vascellaro Đây không phải là bản sao của câu hỏi đó
TWR Cole

Câu trả lời:


146

Bạn luôn trả về một đối tượng; sử dụng return one, twođơn giản trả về một tuple.

Vì vậy, có, -> Tuple[bool, str]là hoàn toàn chính xác.

Chỉ những Tupleloại phép bạn chỉ định một số cố định của các yếu tố, mỗi một loại riêng biệt. Bạn thực sự nên trả về một tuple, luôn luôn, nếu hàm của bạn tạo ra một số giá trị trả về cố định , đặc biệt khi các giá trị đó là các kiểu cụ thể, riêng biệt.

Các kiểu trình tự khác được mong đợi có một đặc điểm kỹ thuật kiểu cho một số phần tử thay đổi, vì vậy typing.Sequencekhông phù hợp ở đây. Cũng xem Sự khác biệt giữa danh sách và bộ giá trị là gì?

Tuples là cấu trúc dữ liệu không đồng nhất (tức là các mục nhập của chúng có ý nghĩa khác nhau), trong khi danh sách là các chuỗi đồng nhất. Tuples có cấu trúc, danh sách có thứ tự.

Hệ thống gợi ý kiểu của Python tuân theo triết lý đó, hiện tại không có cú pháp nào để chỉ định một tệp có thể lặp lại có độ dài cố định và chứa các kiểu cụ thể tại các vị trí cụ thể.

Nếu bạn phải chỉ định rằng bất kỳ tệp nào có thể lặp lại sẽ thực hiện, thì điều tốt nhất bạn có thể làm là:

-> Iterable[Union[bool, str]]

tại thời điểm đó người gọi có thể mong đợi các boolean và chuỗi theo bất kỳ thứ tự nào và có độ dài không xác định (bất kỳ nơi nào từ 0 đến vô cùng).


2
Đặc tả ngôn ngữ cho phép trả về các tệp lặp khác; foo()có thể làm yield True; yield "blah"a, b = foo()sẽ vẫn hoạt động. Hoặc foo()có thể trả lại một danh sách. Tôi đã sửa lại câu hỏi của mình để làm rõ rằng tôi muốn gợi ý một bộ giá trị có thể lặp lại tùy ý, không phải một bộ.
Richard Hansen

2
@RichardHansen: Tôi đã kiểm tra lại PEP và tài liệu của typingmypy2 lần nữa kể từ khi đăng; Tôi khá tự tin rằng tôi đã không bỏ lỡ bất cứ điều gì. Điều đó nói rằng, có một số nhà cung cấp chính quy ở đây trên SO với nhiều kinh nghiệm gợi ý về kiểu Python sẽ không ngần ngại sửa cho tôi nếu hóa ra là sai, hoặc sẽ đăng một câu trả lời tốt hơn.
Martijn Pieters

19
Tôi đã phải thêm from typing import Tuplevào để chú thích Tuple hoạt động.
PHPirate

3
@PHPirate: có, và bạn cũng phải làm như vậy đối với IterableUnion. Vì chúng tôi đang thảo luận về việc sử dụng cụ thể của chúng ở đây, nên việc nhập khẩu được ngụ ý.
Martijn Pieters

4
@MartijnPieters, cảm ơn vì câu trả lời tuyệt vời, nhưng tôi nghĩ nhận xét của PHPirate đáng để chỉnh sửa thành câu trả lời ban đầu của bạn.
Tim Mironov
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.