Am pythonischsten aufrufbar, um True zu generieren?

11

Die Klasse verwendet collections.defaultdicteine Standardfactory, mit der ein Standardwert generiert wird.

Wenn die im dict-like-Objekt enthaltenen Werte standardmäßig verwendet werden sollen, Falsekann die Instanz wie folgt erstellt werden:

d_false = defaultdict(bool)

Was ist der pythonischste Weg, um dasselbe für einen Standardwert von zu erreichen True?

Mit anderen Worten, gibt es ein standardmäßiges aufrufbares Objekt, Truedas idiomatisch als Verwandter von verwendet wird bool?

Natürlich könnte die Fabrik als Lambda-Ausdruck gebaut werden:

d_true = defaultdict(lambda: True)

Dies könnte jedoch das Rad neu erfinden.

PiCTo
quelle
6
lambda: Trueist in Ordnung, solange Sie dieses Standarddiktat nicht auswählen müssen.
Aran-Fey
Hmm, ich denke , dass alle eingebauten Typkonstruktoren einen falsy Wert zurück: int() == 0, list() == [], str() == '', etc. Also ich glaube nicht , dass es ein Standard - Weg , dies zu tun.
Wjandrea
2
Das lambda: valueKonstrukt ist die idiomatische pythonische Methode, um ein Diktat mit einem statischen Standardwert zu erstellen. Ich kenne keinen einfacheren Weg, um eine Funktion zurückzubekommen True.
Mark Reed
Nach meinem früheren Kommentar stellt sich heraus, dass object()es wahr ist - nicht sicher, ob das nützlich ist
wjandrea

Antworten:

9

Nun, du kannst es tun

d = defaultdict(True.__bool__)

aber ich persönlich würde mit dem gehen lambda: True.

Andrej Kesely
quelle
4
Wie @ Aran-Frey oben sagte, kann man picklemit einem Lambda kein Standarddiktat erstellen. Wenn dies eine Überlegung ist, True.__bool__ist dies der richtige Weg. Aber es ist definitiv eine hässlichere Lösung. (Auch nicht verfügbar in Python 2.x, was wahrscheinlich nicht viel ausmacht, nur einen Monat, bis es EOL geht ...)
Mark Reed
4

Wir könnten partialals Alternative zu lambda:

from functools import partial
from collections import defaultdict

d_true = defaultdict(partial(bool, True))

print(d_true['bona fide'])

(Welches ist auch Python 2 freundlich.)

cdlane
quelle
3

Wenn Sie nur einen "wahrheitsgemäßen" Wert wollen, können Sie verwenden object; Dieser Konstruktor gibt ein Objekt zurück, das in einem booleschen Kontext als wahr ausgewertet wird. Aber wenn Sie den tatsächlichen booleschen Wert Truewollen, kenne ich keinen besseren Weg als das lambda: TrueKonstrukt.

Wie Aran-Frey oben sagte, kann man jedoch kein pickleStandarddiktat erstellen, dessen Fabrik eine ist lambda; Wenn das eine Überlegung ist, würde ich mit Andrej Keselys Lösung von gehen True.__bool__.

Mark Reed
quelle