2012-08-07 8 views
12

Per uno dei miei siti, ho bisogno di verificare se diversi attributi di classe sono definiti e non vuoti. Finora, ho felicemente utilizzato if self.attr:, che nella mia mente è la scorciatoia per if self.attr is not None and self.attr is not '':, o qualunque sia il valore indefinito dell'attributo.Stringhe e l'operatore e: best practice, differenze con +

Questo funziona correttamente, ma offre un comportamento sorprendente quando si controllano più attributi di stringa. '' and '' non è False (come mi aspettavo), ma ''.

Questo solleva la domanda: ci sono altri tipi per cui l'operatore and non impone un typecast a bool? Non riesco a trovare un esempio in cui questa differenza di comportamento causerebbe un risultato diverso per la if -clausa (dopotutto, '' si valuta ancora su False), ma sono rimasto con l'istinto che ci sono casi limite che potrebbero essere una trappola.

Infine, sarei desideroso di sapere se qualcuno sa perché è stato implementato in quel modo? Ho pensato che lo Zen di Python incoraggia solo in un modo e un modo solo, e l'operatore + sembra già avere un modo intuitivo per la concatenazione di stringhe.

+1

potresti inserire il codice qui? –

+1

Le risposte non sembrano coprire questo, concentrandosi sulla parte booleana della domanda, ma 'e' non fa mai concatenazione di stringhe; non è come '+' affatto. – geoffspear

+1

[Usa ''' .join' per concatenare le stringhe, non' + '.] (Http://stackoverflow.com/questions/1349311/python-string-join-is-faster-than-but-whats-wrong- qui/1350289 # 1350289) – unutbu

risposta

13

and non esegue mai il bool. Piuttosto, if chiama bool() sul risultato di espressioni.

Un'espressione utilizzando and (e or, è per questo), cortocircuiti quando è in grado di determinare che l'espressione non valuterà a True o False sulla base del primo operando, e restituisce l'ultimo valore valutato:

>>> 0 and 'string' 
0 
>>> 1 and 'string' 
'string' 
>>> 'string' or 10 
'string' 
>>> '' or 10 
10 

Questo "effetto collaterale" è spesso utilizzato in codice Python. Si noti che notfa restituisce un valore booleano. Vedi lo python documentation on boolean operators per i dettagli.

La documentazione spiega anche ciò che costituisce un True o False equivalente di vari tipi, come None, 0, '' e contenitori vuoti essendo False, mentre la maggior parte tutto il resto è equivalente a True.

Per le classi personalizzate, è necessario definire le .__nonzero__() method (rendimenti True o False) o un .__len__() method (restituisce un int, dove 0 è False e tutto il resto è True), di influenzare il loro equivalente booleano, altrimenti sarà sempre predefinito su True.