Soru Python'da Yok ise varsayılan değer döndürmek için kısa yol var mı? [çift]


Bu sorunun zaten bir cevabı var:

C # diyebilirim x ?? ""x, n boş değilse x, ve boşsa dize boş olacaksa Veritabanlarıyla çalışmak için yararlı buldum.

Python değişkende Hiçbiri bulamazsa varsayılan değeri döndürmenin bir yolu var mı?


122
2017-12-04 19:42


Menşei




Cevaplar:


Kullanabilirsiniz or Şebeke:

return x or "default"

Bunun da döndüğünü unutmayın "default" Eğer x boş bir liste, 0, boş dize ve hatta herhangi bir falsi değeridir datetime.time(0) (gece yarısı).


188
2017-12-04 19:44



Eğer x herhangi bir falsi değeri ise, örneğin None, [], ""vb. ama genellikle yeterince iyi ve temiz görünüyor. - FogleBird
X 0 (sıfır) ise "varsayılan" olarak geri döner - thameera
Bunun kötü bir uygulama olduğunu düşünüyorum - bu, 'x' bool'una bazı dönüşümler kullanır ve bu tür bir dönüşüm bulunmazsa başarısız olur (örneğin, pandalar DataFrames ve numpy dizileri) - Alleo
x or default bir antipattern! Hata ayıklaması zor olan sık rastlanan bir hata kaynağıdır, çünkü birçok ince nedenden dolayı x, istenen değer olsa bile false değerini değerlendirebilir. - Quant Metropolis
QuantMetropolis ve Alleo'ya katılıyorum. Çok kötü bir uygulama. Varsayılan bir değere ihtiyaç varsa, o zaman x'in değiştirmek istediğiniz düzensiz bir değer (veya tür) ile görünebileceğini biliyorsunuzdur. Bu yüzden kodunuz belirli bir durumu tespit etmelidir. Bu sadece sürpriz yan etkilerden kaçınmakla kalmaz (aynı zamanda x'in meşru değeri sıfır olduğunda varsayılanı sağlaması gibi), fakat aynı zamanda bakım programcıları için de (muhtemelen daha sonraki kendiniz) burada olmasını istediğiniz şeyi belgeler. - gwideman


return "default" if x is None else x

Yukarıdakileri deneyin.


58
2017-12-04 19:45



Bunu, yalnızca x değeri Yok olduğunda ve diğer yanlış değerler değilken varsayılan değeri istediğinizde kullanın. Hangi C # x ?? "varsayılan" ile eşleşir - brent.payne
Aksi halde, sadece bırak is Noneve bırak x Kendi başına bir Boole değeri olarak değerlendirir. - chepner
Veya @ starhusker'ın x veya "varsayılan" değerini kullanın. Çoğunlukla X Varsa, x.value ne yapmalıyım? Yani x.value eğer x else "default" ise, fakat bu daha okunabilir getattr (obj, "value", "default"). Ticaretin kapanması, daha sonra birçok oto-refactor aletinin yakalanmadığıdır. - brent.payne
Pythonic # PEP20 Python Açık'ın Zen'si örtük olmaktan iyidir. Ne olursa olsun, sadece Hiçbiri Kılıfları ile başa çıkmak için daha iyi. - Doogle


Kullanabilirsiniz koşullu ifade:

x if x is not None else some_value

Örnek:

In [22]: x = None

In [23]: print x if x is not None else "foo"
foo

In [24]: x = "bar"

In [25]: print x if x is not None else "foo"
bar

26
2017-12-04 19:43





x or "default"

En iyi çalışır - iki kez veya ekstra değişken kullanarak, bir işlev çağrısı satır içi hatta kullanabilirsiniz:

self.lineEdit_path.setText( self.getDir(basepath) or basepath )

Qt açarken kullanıyorum dialog.getExistingDirectory() ve boş dizgeyi döndüren iptal.


8
2017-12-21 08:21



“En iyi çalışır” - hariç x meşru bir falsi değere sahip olabilir. sonra bu sözdizimi ince, zor hata ayıklama hatalarına yol açacaktır. - törzsmókus


Üçlü sözdizim var x if x else '' - peşinde olan bu mu?


4
2017-12-04 19:44



Ve aslında değil denilen Üçlü bir sözdizimi (3 işleneni alan herhangi bir operatör, yalnızca bu değil, üçlü operatör olarak adlandırılabilir). Bu doğru isim koşullu bir ifadedir. - Martijn Pieters♦
x == 0 veya herhangi bir falsi değeri için çalışmıyor - wisbucky
@wisbucky, sonra hangi bağlamın gerekli olduğuna özel kriterleri yaparsınız ... None veya başka bir sentinel değeri veya ölçütü ... - Jon Clements♦
@JonClements Kriterler orijinal soruda açıktır; bu nedenle çözümünüz buggy. - Mark E. Haase