Gibt es eine Möglichkeit, einen an die Variable zurückgegebenen Booleschen Wert zu negieren?

78

Ich habe eine Django-Site mit einem ItemObjekt, das eine boolesche Eigenschaft hat active. Ich möchte so etwas tun, um die Eigenschaft von False auf True und umgekehrt umzuschalten:

def toggle_active(item_id):
    item = Item.objects.get(id=item_id)
    item.active = !item.active
    item.save()

Diese Syntax ist in vielen C-basierten Sprachen gültig, scheint jedoch in Python ungültig zu sein. Gibt es eine andere Möglichkeit, dies OHNE Verwendung von:

if item.active:
    item.active = False
else:
    item.active = True
item.save()

Die native Python- neg()Methode scheint die Negation einer Ganzzahl zurückzugeben, nicht die Negation eines Booleschen Werts.

Danke für die Hilfe.

Furbeenator
quelle

Antworten:

157

Du kannst das:

item.active = not item.active

Das sollte den Trick machen :)

jdcantrell
quelle
16

Ich denke du willst

item.active = not item.active
srgerg
quelle
14

item.active = not item.active ist der pythonische Weg

Serdalis
quelle
10

Eine andere (weniger präzise lesbare, mehr arithmetische) Möglichkeit wäre:

item.active = bool(1 - item.active)
miku
quelle
1
+1 OMG, wusste nie, dass dies möglich ist, es macht Sinn, aber ich habe nie darüber nachgedacht !! Gute Antwort! (Obwohl bool(1-True)es dann etwas langsamer ist not True)
Davor Lucic
1
Möglich ja. Nützlich? Unwahrscheinlich! Es gibt Unmengen solcher hässlichen Dinge, die man mit fast jeder Sprache machen kann, aber das ist für die meisten Leser nur schrecklich verwirrend. Vielleicht könnte dies in einem ganz besonderen Kontext Sinn machen ...
BuvinJ
7

Die Negation für Boolesche Werte ist not.

def toggle_active(item_id):
    item = Item.objects.get(id=item_id)
    item.active = not item.active
    item.save()

Danke Jungs, das war eine blitzschnelle Antwort!

Furbeenator
quelle
5

Es ist einfach zu tun:

item.active = not item.active

Am Ende haben Sie also:

def toggleActive(item_id):
    item = Item.objects.get(id=item_id)
    item.active = not item.active
    item.save()
Yugal Jindle
quelle