La plupart des appels pythoniques générant True?

11

La classe collections.defaultdictprend une fabrique par défaut, utilisée pour générer une valeur par défaut.

Si les valeurs contenues dans l' dictobjet -like doivent avoir la valeur par défaut False, l'instance peut être créée comme suit:

d_false = defaultdict(bool)

Quelle est la manière la plus pythonique d'obtenir la même chose pour une valeur par défaut de True?

En d'autres termes, existe-t-il un objet appelable standard retournant Truequi est utilisé de manière idiomatique comme parent de bool?

Bien sûr, l'usine pourrait être construite comme une expression lambda:

d_true = defaultdict(lambda: True)

mais cela pourrait réinventer la roue.

PiCTo
la source
6
lambda: Trueest bien tant que vous n'avez pas besoin de décaper ce défaut.
Aran-Fey
Hmm, je pense que tous les constructeurs de type builtin renvoient une valeur falsy: int() == 0, list() == [], str() == '', etc. Je ne pense pas qu'il y ait un moyen standard pour le faire.
wjandrea
2
La lambda: valueconstruction est la manière idiomatique Pythonic de construire un dict avec une valeur statique par défaut; Je ne connais aucun moyen plus simple d'obtenir le retour d'une fonction True.
Mark Reed
Suite à mon commentaire précédent, il s'avère que object()c'est vrai - je ne sais pas si c'est utile
wjandrea

Réponses:

9

Eh bien, vous pouvez le faire

d = defaultdict(True.__bool__)

mais j'irais personnellement avec le lambda: True.

Andrej Kesely
la source
4
Comme @ Aran-Frey l'a dit ci-dessus, vous ne pouvez pas faire pickleun defaultdict avec un lambda; donc si c'est une considération, True.__bool__c'est la voie à suivre. Mais c'est définitivement une solution plus laide. (En outre, non disponible dans Python 2.x, ce qui n'a probablement pas beaucoup d'importance avec seulement un mois jusqu'à ce qu'il passe en fin de vie ...)
Mark Reed
4

Nous pourrions utiliser partialcomme alternative à lambda:

from functools import partial
from collections import defaultdict

d_true = defaultdict(partial(bool, True))

print(d_true['bona fide'])

(Qui est également compatible avec Python 2.)

cdlane
la source
3

Si vous voulez juste une valeur "véridique", vous pouvez utiliser object; ce constructeur renvoie un objet qui est évalué comme vrai dans un contexte booléen. Mais si vous voulez la valeur booléenne réelle True, je ne connais pas de meilleur moyen que la lambda: Trueconstruction.

Comme Aran-Frey l'a dit ci-dessus, cependant, vous ne pouvez pas pickleun dict par défaut dont l'usine est un lambda; si c'est une considération, j'irais avec la solution d'Andrej Kesely True.__bool__.

Mark Reed
la source