Оператор дополнения Python in-place
Python имеет обычный побитовые операторы, как ~
, &
, |
, и т. д. и операторы на месте любят +=
, &=
, и т.д. чтобы упростить выражения типа:
a = a & 34234
a = a + 577
Кому:
a &= 34234
a += 577
Несмотря на то, что оператор дополнения ~
является унарной функцией и не следует той же структуре, потому что он не используется с двумя значениями (такими как a
и 34234
), можно ли упростить подобные выражения с помощью другого типа оператора?
a = ~a # not bad at all
# Still easy to code but seems redundant
self.container.longVariableName.longName = ~self.container.longVariableName.longName
2 ответа:
Это мучительно неясно, но:
self.container.longVariableName.longName ^= -1
Делает свою работу, пока значения, с которыми вы имеете дело, являются целыми числами. "Являются целыми числами" требуется, чтобы между операторами
~
и^
существовало пригодное для использования математическое отношение.Почему это работает:
- побитовое дополнение - это то же самое, что xor'ING с бесконечной строкой из 1 бита.
- Python поддерживает иллюзию, что целые числа используют представление дополнения бесконечной ширины 2, так что -1 "является" бесконечная строка из 1 бита.
Если вы хотите сделать это только для атрибутов экземпляров объектов, вы можете написать такой метод, как:
def c(obj, atr): setattr(obj,atr,~getattr(obj,atr))
А затем использовать его следующим образом:
c(self.container.longVariableName, 'longName')
Я думаю, что ответ @TimPeters намного лучше, но подумал, что я предоставлю это на случай, если это будет полезно кому-то в будущем, кому нужно сделать это с нецелыми числами, которые рады работать только с мгновенными атрибутами