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.

Antworten:


157

Du kannst das:

item.active = not item.active

Das sollte den Trick machen :)


16

Ich denke du willst

item.active = not item.active


10

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

item.active = bool(1 - item.active)

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!


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()
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.