Cara menentukan beberapa tipe pengembalian menggunakan tip-petunjuk

205

Saya memiliki fungsi dalam python yang dapat mengembalikan a boolatau a list. Apakah ada cara untuk menentukan jenis pengembalian menggunakan petunjuk jenis.

Misalnya, apakah ini cara yang benar untuk melakukannya?

def foo(id) -> list or bool:
      ...
Yahya Uddin
sumber
5
bagaimana Anda berakhir dengan daftar atau boolean?
Padraic Cunningham
11
@ PadraicCunningham Mungkin implementasinya adalah saya akan mengirimkan kepada Anda ID saya, Anda mengirimi saya daftar atau boolean : D
Bhargav Rao
mungkin itu adalah implementasi yang lemah
Sławomir Lenart
@PadraicCunningham Polimorfisme. Jika fungsi Anda melakukan pemeriksaan pada input, apa pun itu, Anda ingin mendapatkan boolean ketika Anda memberi makan satu variabel atau mendapatkan daftar booleans ketika Anda memberi makan daftar variabel.
Guimoute

Jawaban:

282

Dari dokumentasi

kelas typing.Union

Jenis serikat; Serikat [X, Y] berarti X atau Y.

Oleh karena itu cara yang tepat untuk mewakili lebih dari satu tipe data kembali adalah

from typing import Union


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

Namun harap dicatat bahwa pengetikan tidak ditegakkan. Python terus menjadi bahasa yang diketik secara dinamis. Sintaksis penjelasan telah dikembangkan untuk membantu selama pengembangan kode sebelum dirilis ke dalam produksi. Seperti yang dinyatakan PEP 484, "tidak ada pemeriksaan tipe yang terjadi saat runtime."

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

Seperti yang Anda lihat, saya memberikan nilai int dan mengembalikan str. Namun __annotations__akan diatur ke nilai masing-masing.

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

Silakan membaca PEP 483 untuk informasi lebih lanjut tentang petunjuk. Juga lihat Apa itu petunjuk Jenis dalam Python 3.5 ?

Harap perhatikan bahwa ini hanya tersedia untuk Python 3.5 dan yang lebih tinggi. Ini disebutkan dengan jelas dalam PEP 484 .

Bhargav Rao
sumber
Apakah ada yang setara dalam Python 3.4
Yahya Uddin
1
@YahyaUddin Tidak - PEP 484 : '(.... Ini hanya untuk Python3.5 ke atas.
Bhargav Rao
1
@YahyaUddin Cukup mengejutkan. Apakah maksud Anda Anotasi Fungsi kebetulan?
Bhargav Rao
2
Jadi biarkan saya melihat apakah saya mendapatkan ini. Python 3.4 memiliki anotasi fungsi yang tidak dapat dilakukan selain anotasi yang TIDAK diberlakukan. Tetapi dalam Python 3.5 ini adalah pengecekan tipe aktual.
Yahya Uddin
1
@BhargavRao, maaf soal itu! Saya hanya merasa terlalu penting untuk meninggalkan bagian komentar.
Bobort
26

Pernyataan yang def foo(client_id: str) -> list or bool:dievaluasi setara dengan def foo(client_id: str) -> list:dan karenanya tidak akan melakukan apa yang Anda inginkan.

Cara asli untuk menggambarkan petunjuk tipe "baik A atau B" adalah Union (terima kasih kepada Bhargav Rao):

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

Saya tidak ingin menjadi pria "Kenapa Anda ingin melakukan ini", tetapi mungkin memiliki 2 tipe pengembalian bukan yang Anda inginkan:

Jika Anda ingin mengembalikan bool untuk mengindikasikan beberapa jenis kasus kesalahan khusus, pertimbangkan untuk menggunakan Pengecualian. Jika Anda ingin mengembalikan bool sebagai nilai khusus, mungkin daftar kosong akan menjadi representasi yang baik. Anda juga dapat menunjukkan bahwa Nonedapat dikembalikan bersamaOptional[list]

Felk
sumber
6
Ada kegunaan di mana mengembalikan beberapa jenis mungkin apa yang Anda inginkan: misalnya jika Anda perlu mengembalikan salah satu dari beberapa subtipe, tetapi bukan subtipe lain, atau jika Anda mencoba untuk memproses data dan ingin mengembalikan bentuk mentah jika pemrosesan tidak tidak tersedia. Juga, jika Anda membungkus kode lama, itu bisa sangat berguna, karena membantu proses peningkatan dan / atau melihat tempat-tempat yang canggung.
Nathaniel Ford
Pengecualian dan gagasan daftar kosong juga membantu. terima kasih
Yahya Uddin
20

Seandainya ada orang yang mendarat di sini untuk mencari "bagaimana cara menentukan jenis nilai pengembalian ganda?", Gunakan Tuple[type_value1, ..., type_valueN]

from typing import Tuple

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

Info lebih lanjut: https://code-examples.net/en/q/2651e60

Anton Khodak
sumber