2015-12-30 24 views
8

Swift'de var?.prop yapabilirim. Bu, varnil ise, nil sonuçlanır, varprop özelliğinin değeriyle sonuçlanır.Swift İsteğe Bağlı (veya Haskell'ın Belki)?

Aynı şekilde, ben None bana (Just sarılı) var içindeki değere prop uygulayarak değerini verir başka, varNone olduğu bana veren Haskell var >>= prop yapabilirsiniz.

Python'da bir eşdeğer var mı?

, isteğe bağlı öğeleri işlemek için özel bir sözdizimi
+1

Başlık ve etiketleri kafa karıştırıcı. – Snusmumrikken

+0

Koşullu ifade kullanabilirsiniz: Var var ise var var, ancak genel olarak python'da bir şeylerin ne zaman olduğunu bilmeniz beklenmez ve ne zaman ve ne zaman bitip sorulmaz. –

+5

@Snusmumrikken Gerçekten de, gerçekten anlaşılır, sadece anlamak için Swift veya Haskell kavramlarını anlamak gerekir – Zizouz212

cevap

3

Diğer yanıtlar, koşullu bir ifadeyi öneren doğru yoldadır, ancak nasıl yapılacağı konusunda yanlıştır. Python için böyle bir özellik ekleme hakkında bir draft PEP yoktur eşdeğer

None if var is None else var.prop 

ya,

var.prop if var is not None else None 

, ve ther posta listesine Python fikirler üzerinde bunun tartışması olmuştur: Sen bu şekilde yapabiliriz . Yakın gelecekte eklenecek gibi görünmüyor (eğer varsa), fakat PEP'i okumak size mevcut ve önerilen bazı yöntemler hakkında bir fikir verecektir.

+0

"Diğer cevaplar, koşullu bir ifadeyi öneren doğru yoldadır, ancak nasıl yapılacağına dair yanlıştır. Bunu bu şekilde yapabilirsiniz" - sizinkiyle aynı değilse, ana sayfam nasıl yanlış olur? –

+0

@EliKorvigo: Yazmaya başladığım zaman cevabınız yanlıştı, ancak siz düzenlediniz. – BrenBarn

2

Uzun lafın kısası yoktur (hayır opsiyoneldir olmadığından), işlevselliğini taklit etmek koşullu atama (üçlü operatör) kullanabilir olsa:

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

rağmen Python I var'un erişmek istediğiniz özelliğe sahip olup olmadığını kontrol eder.

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

Sen yapmak için bir fonksiyon yazabiliriz daha kısa

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

unpacked_var = optional(var, "prop") 

bu (ve IMHO, daha az açık) yapmak için daha az evrensel bir yolu yoktur: Burada

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

sorun bool(var.prop) == False ise None elde edersiniz, böylece yukarıdaki üçlü operatöre daha iyi yapışırsınız.

+1

Eh, tam olarak değil. Eğer 'var' bazen 'prop' ve bazen 'None' ile bir nesne ise, o zaman bir örtük Opsiyonel ile aynıdır. Bu görünümdeki Python'un var.prop'u, Swift'deki 'var! .prop 'ile aynıdır:' var ',' Yok 'ise atılır. Sonra, 'var' ayrıca 'prop' olmayan başka bir nesne de olabilirdi: Swift bunu "protokolü uygulamıyor" olarak adlandırır, bu yüzden daha kesin bir çeviri (var! As! HavingProp) .prop' gibi bir şeydir.Ve sonra ana fark sadece Swift'in bu türden her türlü varsayımı bir ünlem işareti ile yapmasıdır. –

+7

“Python'da, yazımsal bir yazı yazmayı önemsiz kılar” - ne zamandan beri satır içi koşullu önemsiz bir değer olduğu için. – Ryan

+1

IMO, fikir bitini çıkarmalısın - bu, hangi dil yapılarının "tuhaf" olduğu ve hangisinin "önemsiz" olduğunu tartışacak yer değil. Aksi halde, bu iyi bir cevap - Ben çeşitli seçenekleri keşfetmek istiyorum. (Ancak, gerçekten kısa cevap: "Hayır. Böyle bir sözdizimi yoktur.") – skagedal

İlgili konular