risposta precisa: No. Python non ha un unico operatore integrato op
che può tradursi in x = x or y
x op y
.
Ma quasi. L'operatore bitmap o uguale a (|=
) funzionerà come come descritto sopra se entrambi gli operandi vengono trattati come booleani, con un avvertimento. (Qual è l'avvertenza risposta è inferiore ovviamente?).
In primo luogo, la dimostrazione di base della funzionalità:
x = True
x
Out[141]: True
x |= True
x
Out[142]: True
x |= False
x
Out[143]: True
x &= False
x
Out[144]: False
x &= True
x
Out[145]: False
x |= False
x
Out[146]: False
x |= True
x
Out[147]: True
L'avvertimento è dovuto python non essere strettamente tipizzato e, quindi, anche se sono in corso i valori trattati come booleani in un'espressione non saranno cortocircuitati se dati ad un operatore bit a bit. Per esempio, supponiamo che abbiamo avuto una funzione booleana che cancella una lista e restituisce True
se e solo se non ci sono stati elementi eliminati:
def my_clear_list(lst):
if not lst:
return False
else:
del lst[:]
return True
Ora possiamo vedere il comportamento in cortocircuito come così:
x = True
lst = [1, 2, 3]
x = x or my_clear_list(lst)
print(x, lst)
Output: True [1, 2, 3]
Tuttavia, la commutazione di or
in un bit per bit o (|
) rimuove il cortocircuito, quindi viene eseguita la funzione my_clear_list
.
x = True
lst = [1, 2, 3]
x = x | my_clear_list(lst)
print(x, lst)
Output: True []
Sopra, x = x | my_clear_list(lst)
è equivalente a x |= my_clear_list(lst)
.
Si noti che questi due bit di codice sono in realtà molto diversi: la versione di Python lo imposta su 5 se non è nel Dict del tutto, dove la versione Ruby imposta anche a 5 se è impostata su qualsiasi valore falso. –
@Glenn, non molto diverso, ma molto diverso. Poiché un valore hash non inizializzato restituisce 'nil' (falso nel contesto booleano) questo idioma è spesso usato esattamente per lo scopo che sean ha usato. L'idioma funziona solo se, ovviamente, 'nil' e' false' non sono valori legittimi nell'hash (che è molto spesso vero, quindi l'idioma va bene) – horseyguy
@banister: non so dove si possa disegnare la linea tra "molto" e "abbastanza", ma il punto è che queste non sono affermazioni equivalenti, ed è importante capire la differenza. (False è molto spesso un valore valido in un hash, che ti morderà quando vuoi impostare un valore predefinito per un campo booleano su true, è una lacuna significativa dell'idioma di Ruby.) –