2015-09-08 10 views
10

Ich versuche, herauszufinden, was der beste Weg, dies zu tun ist:Ist dies eine gültige Verwendung eines bedingten Ausdrucks?

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 

Ich denke, der Code ist ganz einfach; Wenn die Zeilen einen Wert haben, fügen Sie sie zur Liste hinzu. Wird dieser Ansatz als in Ordnung betrachtet? Gibt es einen anderen Ansatz, der besser wäre? Die Methode toPython gibt die String-Beschreibung des enthaltenen Objekts zurück.

+8

Nein, das ist nicht OK. Die Verwendung eines Ternärs für Nebenwirkungen ist ein wirklich seltsamer Ansatz, der den Code schwerer lesbar macht (und Ihnen sehr lange Zeilen gibt). – jonrsharpe

+0

Sie hinzufügen möchten, wenn Wert verfügbar ist, wenn der Wert nicht verfügbar ist, was Sie tun möchten – The6thSense

+0

@VigneshKalai nichts, wenn es nicht verfügbar ist Ich füge einfach nichts hinzu – Giannis

Antwort

16

Mit einem "ternären" conditional expression (x if C else y) für Nebenwirkungen ist überhaupt nicht Pythonic. Hier ist, wie ich es tun würde:

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

oder eine Liste Verständnis mit Ausführlichkeit zu reduzieren:

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

Diese Ansätze sind viel besser lesbar und Duplizierung reduzieren.

+0

Immer das Listenverständnis vergessen. Danke, – Giannis

+0

Ist es auch vorgeschlagen, dass ich "ist nicht keine"? Von groovy kommend überspringe ich normalerweise – Giannis

+1

@Giannis ja, es ist; siehe den zweiten Punkt auf https://www.python.org/dev/peps/pep-0008/#programming-recommendations – jonrsharpe

10

Nein, das ist keine gültige Verwendung eines bedingten Ausdrucks. Es verwirrt jeden, der versucht, Ihren Code zu lesen.

Verwenden Sie eine if Anweisung; Sie können durch die Schaffung von weiteren Verweis auf die Liste etwas Platz sparen:

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()) 

aber einen besseren Namen für die lokale Referenz verwenden oder eine Liste Verständnis verwenden (contents vielleicht?):

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

I don Ich halte es für eine gute Praxis, dies zu tun. Was Sie tun können, anstatt ist:

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

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

Dies ermöglicht Ihnen, die Flexibilität auch Bereiche (für IRow in range(5)), oder unter Verwendung von Zeilen, wenn man sie direkt zugreifen kann (for row in rows:).

+0

Wie fügt das zu den zwei vorhandenen Antworten hinzu? – jonrsharpe

+0

Ich hatte die Post geöffnet, bevor es irgendwelche Antworten gab. Zu der Zeit gab es nur zwei Kommentare unter dem OP. Ich denke deine Antwort war richtig. –

+0

Welchen Browser benutzen Sie? Alles, was relativ modern ist, zeigt Ihnen ein Banner, wenn Antworten hinzugefügt oder bearbeitet werden. – jonrsharpe

Verwandte Themen