Najbardziej pythonowe generowalne wywołanie Prawda?

11

Klasa collections.defaultdict przyjmuje domyślną fabrykę, służącą do generowania wartości domyślnej.

Jeśli wartości zawarte w dictpodobnym obiekcie powinny mieć wartość domyślną False, instancję można utworzyć jako:

d_false = defaultdict(bool)

Jaki jest najbardziej pytonowy sposób osiągnięcia tego samego dla wartości domyślnej True ?

Innymi słowy, czy jest zwracany standardowy obiekt na żądanie True który jest idiomatycznie używany jako krewny bool?

Oczywiście fabrykę można zbudować jako wyrażenie lambda:

d_true = defaultdict(lambda: True)

ale to może być wynalezienie koła na nowo.

PiCTo
źródło
6
lambda: Truejest w porządku, o ile nie musisz marynować tego domyślnego nakazu.
Aran-Fey,
Hmm, myślę, że wszyscy konstruktorzy typu wbudowane zwracają wartość falsy: int() == 0, list() == [], str() == '', itd. Więc nie sądzę, jest to standardowy sposób to zrobić.
wjandrea,
2
lambda: valueKonstrukt jest idiomatyczne pythonowy sposób skonstruować dict ze statycznym wartości domyślnej; Nie znam prostszego sposobu na zwrócenie funkcji True.
Mark Reed,
Po moim wcześniejszym komentarzu okazuje się object()być prawdą - nie jestem pewien, czy to jest przydatne
wjandrea

Odpowiedzi:

9

Cóż, możesz zrobić

d = defaultdict(True.__bool__)

ale ja osobiście poszedłbym z lambda: True.

Andrej Kesely
źródło
4
Jak powiedział powyżej @ Aran-Frey, nie można pickledomyślnego zdania z lambda; więc jeśli jest to rozważanie, True.__bool__jest to właściwa droga. Ale to zdecydowanie brzydsze rozwiązanie. (Również niedostępne w Pythonie 2.x, co prawdopodobnie nie ma większego znaczenia po zaledwie miesiącu, aż przejdzie do EOL ...)
Mark Reed
4

Możemy użyć partialjako alternatywy dla lambda:

from functools import partial
from collections import defaultdict

d_true = defaultdict(partial(bool, True))

print(d_true['bona fide'])

(Który jest również przyjazny dla Python 2).

cdlane
źródło
3

Jeśli chcesz tylko „prawdziwej” wartości, możesz użyć object; ten konstruktor zwraca obiekt, który ma wartość true w kontekście logicznym. Ale jeśli chcesz rzeczywistą wartość logiczną True, nie znam lepszego sposobu niż lambda: Truekonstrukcja.

Jak jednak powiedziano powyżej Aran-Frey, nie można pickledomyślnego nakazu, którego fabryką jest lambda; jeśli to rozważanie, wybrałbym rozwiązanie Andreja Kesely'ego True.__bool__.

Mark Reed
źródło