Ответ 1
Вы не можете использовать расширенный оператор присваивания для нескольких целей, нет.
Цитирование дополненной документации присваивания:
За исключением назначения кортежей и нескольких целей в одном утверждении, назначение, выполняемое расширенными операторами присваивания, обрабатывается так же, как и обычные назначения. Аналогично, за исключением возможного поведения на месте, двоичная операция, выполняемая дополненным назначением, такая же, как и обычные двоичные операции.
Акцент на мой.
Расширенное назначение на месте переводится с target -= expression
в target = target.__isub__(expression)
(с соответствующими крючками __i...__
для каждого оператора) и перевод этой операции на несколько целей не поддерживается.
Под капотом расширенное назначение - это специализация двоичных операторов (+
, *
, -
и т.д.), не назначения. Поскольку реализация основана на этих операторах, а бинарные операторы имеют только два операнда, несколько целевых объектов никогда не включались в исходное предложение .
Вам нужно просто применить назначения отдельно:
x -= 1
y -= 2
или, если вы действительно хотите запутаться, используйте модуль operator
и zip()
, чтобы применить operator.isub
к комбинациям (через itertools.starmap()
, затем используйте назначение кортежей:
from operator import sub
from itertools import starmap
x, y = starmap(operator.isub, zip((x, y), (1, 2)))
где isub
будет гарантировать, что правый хук вызван, позволяя вычитать на месте для изменяемых типов, которые его поддерживают.
или, если вы манипулируете типами, которые не поддерживают манипуляции на месте, достаточно использовать выражение генератора:
x, y = (val - delta for val, delta in zip((x, y), (1, 2)))