Non è possibile utilizzare un'istruzione di assegnazione aumentata su più destinazioni, no.
Con l'eccezione di assegnare alle tuple e gli obiettivi multipli in una singola istruzione, l'assegnazione fatto da istruzioni di assegnamento aumentata viene gestita allo stesso modo le assegnazioni normali. Allo stesso modo, ad eccezione del possibile comportamento sul posto , l'operazione binaria eseguita dall'assegnazione aumentata è la stessa delle normali operazioni binarie.
Enfasi mia.
in luogo assegnamento incrementale è tradotta da target -= expression
a target = target.__isub__(expression)
(con corrispondenti __i...__
ganci per ogni operatore) e tradurre tale operazione di bersagli multipli non è supportata.
Sotto il cofano, assegnamento incrementale è una specializzazione degli operatori binari (+
, *
, -
, ecc), non di assegnazione. Poiché l'implementazione si basa su quegli operatori e gli operatori binari hanno sempre solo due operandi, non sono mai stati inclusi più target nell'originale implementation proposal.
Dovrete semplicemente applicare le assegnazioni separatamente:
x -= 1
y -= 2
o, se davvero, davvero voleva ottenere contorto, utilizzare il modulo operator
e zip()
applicare operator.isub
alle combinazioni (via itertools.starmap()
, quindi utilizzare assegnazione tupla:
from operator import sub
from itertools import starmap
x, y = starmap(operator.isub, zip((x, y), (1, 2)))
dove isub
farà in modo che il gancio destro è chiamato consentendo sottrazione sul posto per i tipi mutabili th a supportarlo.
o, se si sta manipolando i tipi che non supportano la manipolazione sul posto, utilizzando un generatore di espressione sufficiente rilevare:
x, y = (val - delta for val, delta in zip((x, y), (1, 2)))