Come posso ottenere da vicino?: Da C ++ / C # in Python?
-
02-07-2019 - |
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'?
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
- Python ha un operatore condizionale ternario?
- Qual è il modo migliore per sostituire il operatore ternario in Python?
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 ...