Domanda

In C # potrei facilmente scrivere quanto segue:

string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;

Esiste un modo rapido per fare la stessa cosa in Python o sono bloccato con un'istruzione 'if'?

È stato utile?

Soluzione

In Python 2.5, c'è

A if C else B

che si comporta in modo molto simile?: in C. Tuttavia, è disapprovato per due motivi: la leggibilità e il fatto che di solito c'è un modo più semplice per affrontare il problema. Ad esempio, nel tuo caso:

stringValue = otherString or defaultString

Altri suggerimenti

@ Dan

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString
     

Questo tipo di codice è più lungo e più espressivo, ma anche più leggibile

Beh, sì, è più lungo. Non sono così sicuro di & # 8220; più espressivo & # 8221; e & # 8220; più leggibile & # 8221 ;. Per lo meno, il tuo reclamo è contestabile. Vorrei persino dire che è assolutamente sbagliato, per due motivi.

Innanzitutto, il tuo codice enfatizza il processo decisionale (piuttosto estremamente). D'altra parte, l'operatore condizionale sottolinea qualcos'altro, vale a dire il valore (o l'assegnazione di detto valore). E questo è esattamente ciò che vuole chi scrive questo codice. Il processo decisionale è in realtà piuttosto un sottoprodotto del codice. La parte importante qui è l'operazione di assegnazione. Il tuo codice nasconde questo compito con un sacco di rumore sintattico: la ramificazione.

Il tuo codice è meno espressivo perché sposta l'enfasi dalla parte importante.

Anche allora il tuo codice probabilmente vincerebbe qualche oscura arte ASCII come ?: . Sarebbe preferibile un se in linea. Personalmente, non mi piace la variante introdotta con Python 2.5 perché è all'indietro. Preferirei qualcosa che legge nello stesso flusso (direzione) dell'operatore C ternario ma usa parole anziché caratteri ASCII:

C = if cond then A else B

Questo vince a mani basse.

C e C # purtroppo non hanno una dichiarazione così espressiva. Ma (e questo è il secondo argomento), l'operatore condizionale ternario dei linguaggi C è così a lungo stabilito che è diventato un linguaggio in sé. L'operatore ternario è parte della lingua tanto quanto il & # 8220; convenzionale & # 8221; if . Perché è un linguaggio, chiunque conosca la lingua legge immediatamente questo codice. Inoltre, è un modo estremamente breve e conciso di esprimere questa semantica. In effetti, è il modo più breve immaginabile. È estremamente espressivo perché non oscura l'essenza con rumore inutile.

Infine, Jeff Atwood ha scritto la conclusione perfetta per questo: Il miglior codice non è affatto un codice .

Scrivere codice leggibile ed espressivo non è mai una brutta cosa.

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString

Questo tipo di codice è più lungo e più espressivo, ma anche più leggibile e ha meno probabilità di inciampare o di essere modificato male lungo la strada. Non abbiate paura di scrivere espressamente - il codice leggibile dovrebbe essere un obiettivo, non un sottoprodotto.

Ci sono alcuni duplicati di questa domanda, ad esempio

In sostanza, in un'impostazione generale il codice pre-2.5 dovrebbe usare questo:

 (condExp and [thenExp] or [elseExp])[0]

(dato condExp, thenExp e elseExp sono espressioni arbitrarie), in quanto evita risultati errati se thenExp valuta falso booleano, pur mantenendo la valutazione del corto circuito.

A proposito, j0rd4n, non ( per favore non!) scrivere codice come questo in C #. A parte il fatto che IsDefaultOrNull in realtà è chiamato IsNullOrEmpty , questo è puro codice. C # offre all'operatore di coalizione situazioni come queste:

string stringValue = otherString ?? defaultString;

È vero che questo funziona solo se otherString è null (piuttosto che vuoto) ma se questo può essere garantito in anticipo (e spesso può farlo) rende molto il codice più leggibile.

Ho anche scoperto che usando semplicemente " o " operatore fa abbastanza bene. Ad esempio:

finalString = get_override() or defaultString

Se get_override () restituisce " " o Nessuno, utilizzerà sempre defaultString .

Il capitolo 4 di diveintopython.net ha la risposta. Si chiama e-o trucco in Python.

Puoi trarre vantaggio dal fatto che le espressioni logiche restituiscono il loro valore e non solo lo stato vero o falso. Ad esempio, puoi sempre utilizzare:

result = question and firstanswer or secondanswer

Con l'avvertenza che non funziona come l'operatore ternario se firstanswer è falso. Questo perché la domanda viene valutata per prima, supponendo che sia restituita la prima risposta a meno che la prima risposta sia falsa, quindi questo utilizzo non funziona come l'operatore ternario. Se conosci i valori, tuttavia, di solito non ci sono problemi. Un esempio potrebbe essere:

result = choice == 7 and "Seven" or "Another Choice"

Se hai usato il rubino, potresti scrivere

stringValue = otherString.blank? ? defaultString : otherString;

il metodo vuoto? incorporato significa null o vuoto.
Vieni nel lato oscuro ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top