Come devo distinguere tra i tipi built-in in Python?

2

Ho una funzione che accetta una stringa o un dizionario come argomento. Cioè, può essere chiamato come:

lookup_person({name: "John Smith", age: 57})

o

lookup_person("John Smith")

La mia prima inclinazione è usare type o isinstance per distinguere il tipo dell'argomento, ma ho visto un sacco di inchiostro rovesciato sopra se e quando il rilevamento del tipo rigido è appropriato. La saggezza prevalente che ho letto suggerisce che dovrei provare se il mio oggetto implementa un'interfaccia, ma testare una stringa particolare o i metodi del dizionario sembrano molto meno sicuri rispetto al semplice test se il tipo dell'oggetto è una stringa o un dizionario.

È possibile utilizzare la digitazione anatra qui, ed è appropriato farlo? O ho un problema più grande, e il mio approccio qui in qualche modo fondamentalmente non è Pythonic?

EDIT: per chiarire, passare un dizionario è l'uso "tipico". Il passaggio in una stringa è semplicemente un'abbreviazione API per un dizionario a voce singola con name , cioè lookup_person({name:"John Smith"}) .

    
posta apsillers 15.01.2013 - 16:06
fonte

1 risposta

3

Sicuramente puoi usare la digitazione anatra qui, anche se non sono sicuro perché vuoi accettare sia un dizionario che una stringa in questo caso.

In questo caso chiederei perdono invece del permesso:

try:
    name = person['name']  # treat as dictionary
except TypeError:
    name = person          # assume it's a string instead

ma controlla se il richiesta dell'autorizzazione potrebbe essere più veloce per il tuo caso .

    
risposta data 15.01.2013 - 16:10
fonte

Leggi altre domande sui tag