2011-12-01 21 views
38

Tengo un sitio Django, con un objeto Item que tiene una propiedad booleana active. Me gustaría hacer algo como esto para cambiar la propiedad de falso a verdadero y viceversa:¿Hay alguna forma de anular una variable booleana devuelta?

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

Esta sintaxis es válida en muchos lenguajes basados ​​en C, pero parece válida en Python. ¿Hay otra manera de hacer esto sin usar:

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

El método nativo pitón neg() parece volver la negación de un entero, no la negación de un valor lógico.

Gracias por la ayuda.

Respuesta

85

Usted puede hacer esto:

item.active = not item.active

Que debe hacer el truco :)

12

item.active = not item.active es la forma Pythonic

13

Creo que quieres

item.active = not item.active 
6

El negation for booleans es not.

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

Gracias chicos, ¡fue una respuesta rapidísima!

5

Su simple de hacer:

item.active = not item.active 

Así que, finalmente, el resultado final será con:

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

Otro (menos concisa legible, más aritmética) manera de hacerlo sería:

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

+1 OMG, nunca supe que esto fuera posible, tiene sentido pero nunca lo pensé !! ¡Gran respuesta! (Aunque 'bool (1-True)' es un poco más lento que 'not True') –

+0

Posible, sí. ¿Útil? ¡No es probable! Hay toneladas de cosas tan feas que puedes hacer con casi cualquier idioma, pero esto es terriblemente confuso para la mayoría de los lectores. Quizás en un contexto muy especial, esto podría tener sentido ... – BuvinJ

Cuestiones relacionadas