La mayoría de las llamadas pitónicas generan Verdadero?

11

La clase collections.defaultdicttoma una fábrica predeterminada, utilizada para generar un valor predeterminado.

Si los valores contenidos en el dictobjeto -like deberían ser predeterminados False, la instancia se puede crear como:

d_false = defaultdict(bool)

¿Cuál es la forma más pitónica de lograr lo mismo para un valor predeterminado de True?

En otros términos, ¿hay un retorno de objeto invocable estándar Trueque se utiliza idiomáticamente como pariente de bool?

Por supuesto, la fábrica podría construirse como una expresión lambda:

d_true = defaultdict(lambda: True)

pero esto podría estar reinventando la rueda.

PiCTo
fuente
66
lambda: Trueestá bien siempre y cuando no necesite encurtir ese defecto predeterminado.
Aran-Fey
Hmm, creo que todos los constructores de tipo incorporado devuelven un valor Falsy: int() == 0, list() == [], str() == '', etc. Así que no creo que haya una manera estándar de hacer esto.
wjandrea
2
La lambda: valueconstrucción es la forma idiomática pitónica de construir un dict con un valor estático predeterminado; No conozco una forma más simple de hacer que una función regrese True.
Mark Reed
Después de mi comentario anterior, resulta que object()es Truthy - no estoy seguro si eso es útil
wjandrea

Respuestas:

9

Bueno, tu puedes hacer

d = defaultdict(True.__bool__)

pero yo personalmente iría con el lambda: True.

Andrej Kesely
fuente
44
Como @ Aran-Frey dijo anteriormente, no se puede pickleimponer por defecto una lambda; así que si eso es una consideración, True.__bool__es el camino a seguir. Pero definitivamente es una solución más fea. (Además, no está disponible en Python 2.x, lo que probablemente no importa mucho con solo un mes hasta que pase EOL ...)
Mark Reed
4

Podríamos usar partialcomo alternativa a lambda:

from functools import partial
from collections import defaultdict

d_true = defaultdict(partial(bool, True))

print(d_true['bona fide'])

(Que también es compatible con Python 2).

cdlane
fuente
3

Si solo desea un valor "verdadero", puede usarlo object; ese constructor devuelve un objeto que se evalúa como verdadero en un contexto booleano. Pero si quieres el valor booleano real True, no conozco una mejor manera que la lambda: Trueconstrucción.

Sin embargo, como dijo Aran-Frey anteriormente, no se puede determinar por pickledefecto cuál fábrica es una lambda; si eso es una consideración, iría con la solución de Andrej Kesely True.__bool__.

Mark Reed
fuente