2015-12-30 13 views
8

In Swift kann ich var?.prop tun. Dies ergibt nil, wenn varnil ist, sonst ergibt es den Wert der prop Eigenschaft von var.Swift Optionals (oder vielleicht Haskells) in Python?

Gleichwertig kann ich var >>= prop in Haskell tun, was gibt mir None ist var ist None, sonst gibt es mir den Wert von prop auf den Wert innerhalb var (in Just verpackt) Anwendung.

Gibt es in Python ein Äquivalent?

+1

Verwirrender Titel und Tags. – Snusmumrikken

+0

Sie können einen Bedingungsausdruck verwenden: 'var.prop if var else var', aber im Allgemeinen wird in Python erwartet, dass Sie wissen, wann etwas None ist und wann nicht und nicht immer wieder nachfragen. –

+5

@Snusmumrikken Nicht wirklich, es ist wirklich klar, du musst nur die Konzepte von Swift oder Haskell verstehen, um es verstehen zu können. – Zizouz212

Antwort

3

Die anderen Antworten sind auf dem richtigen Weg, wenn sie einen konditionalen Ausdruck vorschlagen, aber falsch, wie man das macht. Sie können es auf diese Weise tun:

None if var is None else var.prop 

oder äquivalent

var.prop if var is not None else None 

Es gibt eine draft PEP über eine solche Funktion zu Python hinzufügen und ther hat sich auf die Python-Ideen Diskussion davon gewesen Mailingliste . Es sieht nicht so aus, als ob es in naher Zukunft hinzugefügt wird (wenn überhaupt), aber das Lesen der PEP gibt Ihnen eine Vorstellung von einigen existierenden und vorgeschlagenen Wegen, dies zu handhaben.

+0

"Die anderen Antworten sind auf dem richtigen Weg, wenn sie einen bedingten Ausdruck vorschlagen, aber falsch, wie man das macht. Das kannst du so machen" - wie ist mein Anawer falsch, wenn er mit deinem identisch ist? –

+0

@EliKorvigo: Ihre Antwort war zu der Zeit falsch, als ich anfing, dies zu schreiben, aber Sie haben es dann bearbeitet. – BrenBarn

2

Lange Rede kurzer Sinn, gibt es keine spezielle Syntax optionals zu behandeln (da es keine Extras), obwohl können Sie bedingte Zuweisung verwenden (ternäre Operator), um die Funktionalität zu imitieren:

unpacked_var = var.prop if var is not None else None 

Obwohl in Python I würde lieber überprüfen, ob var das Attribut hat, auf das Sie zugreifen möchten.

unpacked_var = var.prop if hasattr(var, "prop") else None 

Sie können eine Funktion schreiben, um es kürzer

def optional(var, attr): 
    return getattr(var, attr) if hasattr(var, attr) else None 

unpacked_var = optional(var, "prop") 

Es gibt eine weniger universell diese (und weniger explizit, IMHO) zu tun:

unpacked_var = hasattr(var, "prop") and var.prop or None 

Das Problem hier ist, dass Sie None wenn bool(var.prop) == False erhalten, so dass Sie besser bei dem ternären Operator oben bleiben sollten.

+1

Nun, nicht genau. Wenn 'var' manchmal ein Objekt mit' prop' und manchmal 'None' ist, dann ist es genau das gleiche wie ein implizites Optional. Pythons 'var.prop' in dieser Ansicht ähnelt" var! .prop "in Swift: Es würde geworfen, wenn' var' 'None' ist. Dann könnte "var" auch ein anderes Objekt ohne "prop" sein: Swift nennt dies "nicht das Protokoll implementieren", also ist eine genauere Übersetzung etwas wie '(var! As! HavingProp) .prop'.Und dann ist der Hauptunterschied nur, dass Swift jede Annahme dieser Art mit einem Ausrufezeichen explizit macht. –

+7

"In Python macht dynamisches Tippen es trivial" - seit wann ist ein Inline-bedingtes Trivial im Vergleich zu '.?'? – Ryan

+1

IMO, sollten Sie das Meinungs-Bit entfernen - das ist nicht der Ort, um zu diskutieren, welche Sprachkonstrukte "komisch" sind und welche "trivial" sind. Ansonsten ist dies eine gute Antwort - ich mag es, dass Sie verschiedene Optionen erkunden. (Allerdings ist die wirklich kurze Antwort: "Nein. Es gibt keine solche Syntax.") – skagedal

Verwandte Themen