2015-09-08 18 views
10

sto cercando di capire quale sia il modo migliore per farlo è:È un uso valido di un'espressione condizionale?

resource['contents'][media_type] = [] 
resource['contents'][media_type].append(row[0].toPython()) if row[0] is not None else None 
resource['contents'][media_type].append(row[2].toPython()) if row[2] is not None else None 

Credo che il codice è molto semplice; se le righe hanno un valore, aggiungili alla lista. Questo approccio è considerato OK? C'è qualche altro approccio che sarebbe meglio? Il metodo toPython restituirà la descrizione della stringa dell'oggetto contenuto.

+8

No, non è considerato OK. Usare un ternario per gli effetti collaterali è un approccio davvero strano, rendendo il codice più difficile da leggere (e dandoti linee molto lunghe). – jonrsharpe

+0

si desidera aggiungere se il valore è disponibile se il valore non è disponibile cosa si vuole fare – The6thSense

+0

@VigneshKalai nulla se non è disponibile semplicemente non aggiungere qualcosa – Giannis

risposta

16

L'utilizzo di un "ternario" conditional expression (x if C else y) per gli effetti collaterali non è affatto Pythonic. Ecco come lo farei:

resource['contents'][media_type] = [] 
for index in (0, 2): 
    item = row[i] 
    if item is not None: 
     resource['contents'][media_type].append(item.toPython()) 

o utilizzando un elenco di comprensione per ridurre la verbosità:

resource['contents'][media_type] = [row[i].toPython() for i in (0, 2) 
            if row[i] is not None] 

Questi approcci sono molto più leggibile, e ridurre la duplicazione.

+0

Dimentica sempre la comprensione delle liste. Grazie – Giannis

+0

Inoltre, suggerisco di includere 'is not None'? Venendo da groovy di solito ometto che – Giannis

+1

@Giannis si, lo è; vedere il secondo punto elenco su https://www.python.org/dev/peps/pep-0008/#programming-recommendations – jonrsharpe

10

No, non è un uso valido di un'espressione condizionale. Confonde chiunque cerchi di leggere il tuo codice.

Utilizzare una dichiarazione if; si può risparmiare un po 'di spazio con la creazione di un altro riferimento alla lista:

lst = resource['contents'][media_type] = [] 
if row[0] is not None: lst.append(row[0].toPython()) 
if row[2] is not None: lst.append(row[2].toPython()) 

ma utilizzare un nome migliore per il riferimento locale, o utilizzare una list comprehension (contents forse?):

resource['contents'][media_type] = [ 
    col.toPython() for col in (row[0], row[2]) if col is not None] 
2

I don Penso che sia considerato una buona pratica farlo. Che cosa si potrebbe fare, invece è:

resource['contents'][media_type] = [] 

for irow in [0, 2]: 
    if row[irow] is not None: 
     resource['contents'][media_type].append(row[irow].toPython()) 

Ciò consente la flessibilità di utilizzare anche gli intervalli (per IRow in range(5)), oppure utilizzando righe se è possibile accedere direttamente (for row in rows:).

+0

Come si aggiunge alle due risposte esistenti? – jonrsharpe

+0

Ho avuto il post aperto prima che ci fossero delle risposte. Al momento, c'erano solo due commenti sotto l'OP. Penso che la tua risposta sia corretta. –

+0

Che browser stai usando? Qualunque cosa relativamente moderna ti mostrerà un banner quando le risposte vengono aggiunte o modificate. – jonrsharpe

Problemi correlati