Come specificare più tipi di ritorno usando i suggerimenti di tipo


205

Ho una funzione in Python che può restituire a boolo a list. C'è un modo per specificare i tipi di ritorno usando i suggerimenti di tipo.

Ad esempio, è questo il modo corretto di farlo?

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

5
come si finisce con un elenco o un booleano?
Padraic Cunningham,

11
@PadraicCunningham Forse l'implementazione è che ti invierò il mio ID, tu mi invii un elenco o un booleano : D
Bhargav Rao

probabilmente si tratta di un'applicazione debole
Sławomir Lenart,

Polimorfismo di @PadraicCunningham. Se la tua funzione esegue un controllo sull'input, qualunque esso sia, vuoi ottenere un valore booleano quando nutri una variabile o ottieni un elenco di valori booleani quando nutri un elenco di variabili.
Guimoute,

Risposte:


282

Dalla documentazione

classe typing.Union

Tipo di unione; Unione [X, Y] significa X o Y.

Quindi il modo corretto di rappresentare più di un tipo di dati di ritorno è

from typing import Union


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

Ma nota che la digitazione non è forzata. Python continua a rimanere un linguaggio tipizzato in modo dinamico. La sintassi delle annotazioni è stata sviluppata per aiutare durante lo sviluppo del codice prima di essere rilasciata in produzione. Come afferma PEP 484, "nessun controllo del tipo avviene in fase di esecuzione".

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

Come puoi vedere sto passando un valore int e restituendo una str. Tuttavia __annotations__verrà impostato sui rispettivi valori.

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

Consulta PEP 483 per ulteriori informazioni sui suggerimenti per il tipo. Vedi anche Cosa sono i suggerimenti sul tipo in Python 3.5 ?

Si prega di notare che questo è disponibile solo per Python 3.5 e versioni successive . Ciò è menzionato chiaramente in PEP 484 .


Esiste un equivalente in Python 3.4
Yahya Uddin del

1
@YahyaUddin Nope - PEP 484 : '(.... È solo per Python3.5 verso l'alto.
Bhargav Rao

1
@YahyaUddin Abbastanza sorprendente. Intendevi forse annotazioni di funzioni ?
Bhargav Rao

2
Fammi vedere se ho capito. Python 3.4 ha annotazioni di funzioni che non fanno altro che annotare che NON viene applicato. Ma in Python 3.5 si tratta del controllo del tipo effettivo.
Yahya Uddin il

1
@BhargavRao, mi dispiace per quello! Ho pensato che fosse troppo importante lasciarlo nella sezione commenti.
Bobort,

26

L'affermazione def foo(client_id: str) -> list or bool:quando valutata è equivalente def foo(client_id: str) -> list:e quindi non farà ciò che desideri.

Il modo nativo per descrivere un suggerimento di tipo "A o B" è Union (grazie a Bhargav Rao):

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

Non voglio essere il ragazzo "Perché vuoi farlo comunque", ma forse avere 2 tipi di ritorno non è quello che vuoi:

Se si desidera restituire un valore booleano per indicare un tipo di caso di errore speciale, considerare invece l'utilizzo di Eccezioni. Se vuoi restituire un bool come valore speciale, forse un elenco vuoto sarebbe una buona rappresentazione. Puoi anche indicare che Nonepotrebbe essere restituito conOptional[list]


6
Esistono usi in cui la restituzione di più tipi può essere ciò che desideri: ad esempio se è necessario restituire uno di alcuni set di sottotipi, ma non altri sottotipi, o se si sta tentando di elaborare i dati e si desidera restituire il modulo non elaborato se l'elaborazione non è non disponibile. Inoltre, se stai racchiudendo il codice legacy, può essere abbastanza utile, perché aiuta il processo di aggiornamento e / o vede luoghi scomodi.
Nathaniel Ford,

Anche le eccezioni e l'idea dell'elenco vuoto sono state utili. grazie
Yahya Uddin il

20

Nel caso in cui qualcuno sia atterrato qui alla ricerca di "come specificare tipi di valori di ritorno multipli?", Utilizzare Tuple[type_value1, ..., type_valueN]

from typing import Tuple

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

Ulteriori informazioni: https://code-examples.net/en/q/2651e60

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.