En pitonik çağrılabilir True üreten?


11

Sınıf collections.defaultdict, varsayılan bir değer oluşturmak için kullanılan bir varsayılan fabrika alır.

dict-Like nesnesinde bulunan değerlerin varsayılan olarak ayarlanması gerekiyorsa False, örnek şu şekilde oluşturulabilir:

d_false = defaultdict(bool)

Aynı değer için varsayılan değeri elde etmenin en pitonik yolu nedir True?

Diğer bir deyişle, Truedeyimsel olarak deyimsel olarak kullanılan standart bir çağrılabilir nesne var boolmı?

Tabii ki, fabrika bir lambda ifadesi olarak inşa edilebilir:

d_true = defaultdict(lambda: True)

ama bu tekerleği yeniden keşfediyor olabilir.


6
lambda: Truebu varsayılan kararı seçmenize gerek olmadığı sürece iyidir.
Aran-Fey

Hmm, bütün yerleşik type kurucular bir falsy değeri döndürür düşünüyorum: int() == 0, list() == [], str() == '', vb Bunu yapmak için standart bir yol var olduğunu sanmıyorum Yani.
wjandrea

2
lambda: valueYapı statik varsayılan değeri olan bir dicti inşa etmek deyimsel Pythonic yoludur; Geri dönen bir fonksiyon almanın daha basit bir yolunu bilmiyorum True.
Mark Reed


Önceki object()yorumumu takiben , doğrudur - bunun yararlı olup olmadığından emin değilim
wjandrea

Yanıtlar:


9

Peki yapabilirsin

d = defaultdict(True.__bool__)

ama ben şahsen ile giderdim lambda: True.


4
@ Aran-Frey'in yukarıda söylediği gibi, picklevarsayılan bir lambda ile karar veremezsiniz ; yani bu bir düşüncedir, True.__bool__gidilecek yoldur. Ama bu kesinlikle daha çirkin bir çözüm. (Ayrıca, EOL gidene kadar sadece bir ay ile önemli olmayan Python 2.x'te mevcut değildir ...)
Mark Reed

4

Biz kullanabilirsiniz partialalternatif olarak lambda:

from functools import partial
from collections import defaultdict

d_true = defaultdict(partial(bool, True))

print(d_true['bona fide'])

(Bu da Python 2 dostudur.)


3

Eğer sadece "gerçeğe uygun" bir değer istiyorsanız, kullanabilirsiniz object; bu kurucu boolean bağlamında true olarak değerlendirilen bir nesneyi döndürür. Ama eğer gerçek boole değerini istiyorsanız True, lambda: Trueyapıdan daha iyi bir yol bilmiyorum .

Yine de Aran-Frey'in dediği gibi, picklefabrikası bir lambda; bu bir düşünce, Andrej Kesely'nin çözümü ile devam ediyorum True.__bool__.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.