Callable mais python gerando True?

11

A classe collections.defaultdictusa uma fábrica padrão, usada para gerar um valor padrão.

Se os valores contidos no dictobjeto -like forem padronizados False, a instância poderá ser criada como:

d_false = defaultdict(bool)

Qual é a maneira mais pitônica de conseguir o mesmo com um valor padrão de True?

Em outros termos, existe um objeto padrão Trueque pode ser retornado que é usado idiomaticamente como parente de bool?

Obviamente, a fábrica poderia ser construída como uma expressão lambda:

d_true = defaultdict(lambda: True)

mas isso pode estar reinventando a roda.

PiCTo
fonte
6
lambda: Trueé bom, desde que você não precise escolher esse padrão.
Aran-Fey
Hmm, eu acho que todos os construtores tipo interno retornar um valor Falsas: int() == 0, list() == [], str() == '', etc. Então eu não acho que há uma maneira padrão para fazer isso.
Wjandrea
2
A lambda: valueconstrução é a maneira Python idiomática de construir um ditado com um valor padrão estático; Não conheço nenhuma maneira mais simples de obter uma função retornando True.
Mark Reed
Após meu comentário anterior, despeja object()é truthy - não tenho certeza se isso é útil
wjandrea

Respostas:

9

Bem, você pode fazer

d = defaultdict(True.__bool__)

mas eu pessoalmente iria com o lambda: True.

Andrej Kesely
fonte
4
Como @ Aran-Frey disse acima, você não pode pickleusar um padrão com um lambda; então, se isso é uma consideração, True.__bool__é o caminho a percorrer. Mas é definitivamente uma solução mais feia. (Também, não disponível em Python 2.x, o que provavelmente não importa muito com apenas um mês até que ele vai EOL ...)
Mark Reed
4

Nós poderíamos usar partial como uma alternativa para lambda:

from functools import partial
from collections import defaultdict

d_true = defaultdict(partial(bool, True))

print(d_true['bona fide'])

(O que também é compatível com o Python 2.)

cdlane
fonte
3

Se você quer apenas um valor "verdade", você pode usar object; esse construtor retorna um objeto que é avaliado como verdadeiro em um contexto booleano. Mas se você deseja o valor booleano real True, não conheço uma maneira melhor do que a lambda: Trueconstrução.

Como Aran-Frey disse acima, no entanto, você não pode pickledefinir um ditado cuja fábrica é a lambda; se isso é uma consideração, eu aceitaria a solução de Andrej Kesely True.__bool__.

Mark Reed
fonte