La maggior parte delle chiamate pitoniche generano True?


11

La classe collections.defaultdictaccetta un factory predefinito, utilizzato per generare un valore predefinito.

Se i valori contenuti dictnell'oggetto -like devono essere predefiniti False, l'istanza può essere creata come:

d_false = defaultdict(bool)

Qual è il modo più pitonico per ottenere lo stesso per un valore predefinito di True?

In altri termini, esiste un oggetto richiamabile standard Trueche viene usato idiomaticamente come parente di bool?

Naturalmente, la fabbrica potrebbe essere costruita come espressione lambda:

d_true = defaultdict(lambda: True)

ma questo potrebbe reinventare la ruota.


6
lambda: Trueva bene fintanto che non è necessario sottrarre tale difetto.
Aran-Fey,

Hmm, penso che tutti i costruttori di tipo incorporato restituiscono un valore falsy: int() == 0, list() == [], str() == '', ecc Quindi non credo che ci sia un modo standard per fare questo.
wjandrea,

2
Il lambda: valuecostrutto è il modo idiomatico di Pythonic per costruire un dict con un valore predefinito statico; Non conosco un modo più semplice per far tornare una funzione True.
Mark Reed,


A seguito del mio commento precedente, risulta che object()è vero - non sono sicuro che sia utile
wjandrea il

Risposte:


9

Bene, puoi farlo

d = defaultdict(True.__bool__)

ma personalmente andrei con il lambda: True.


4
Come @ Aran-Frey ha detto sopra, non è possibile pickleun defaultdict con un lambda; quindi se questa è una considerazione, True.__bool__è la strada da percorrere. Ma è sicuramente una soluzione più brutta. (Inoltre, non disponibile in Python 2.x, che probabilmente non importa molto con solo un mese fino a quando non diventa EOL ...)
Mark Reed,

4

Potremmo usare partialin alternativa a lambda:

from functools import partial
from collections import defaultdict

d_true = defaultdict(partial(bool, True))

print(d_true['bona fide'])

(Che è anche Python 2 amichevole.)


3

Se vuoi solo un valore "veritiero", puoi usare object; quel costruttore restituisce un oggetto che viene valutato come vero in un contesto booleano. Ma se vuoi il valore booleano attuale True, non conosco un modo migliore del lambda: Truecostrutto.

Come Aran-Frey ha detto sopra, tuttavia, non è possibile pickleun ditt default la cui fabbrica è una lambda; se questa è una considerazione, andrei con la soluzione di Andrej Kesely True.__bool__.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.