2011-12-01 27 views
38

Tôi có một trang web Django, với đối tượng Item có thuộc tính boolean active. Tôi muốn làm điều gì đó như thế này để chuyển tài sản từ False True và ngược lại:Có cách nào để phủ nhận boolean được trả về biến không?

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

cú pháp này có giá trị trong nhiều ngôn ngữ C-based, nhưng dường như không hợp lệ trong Python. Có một cách khác để làm điều này KHÔNG sử dụng:

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

Các nguồn gốc phương pháp python neg() dường như trở sự phủ định của một số nguyên, không phải là phủ định của một boolean.

Cảm ơn sự giúp đỡ.

Trả lời

85

Bạn có thể làm điều này:

item.active = not item.active

Điều đó sẽ làm các trick :)

12

item.active = not item.active là cách pythonic

13

Tôi nghĩ rằng bạn muốn

item.active = not item.active 
6

Các phủ định cho booleans là not.

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

Xin cảm ơn các bạn, đó là phản ứng cực nhanh!

5

đơn giản để làm nó:

item.active = not item.active 

Vì vậy, cuối cùng bạn sẽ kết thúc với:

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

khác (ít súc tích có thể đọc được, số học hơn) cách để làm điều đó sẽ là:

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

+1 OMG, không bao giờ biết điều này là có thể, nó có ý nghĩa nhưng tôi chưa bao giờ nghĩ về điều đó !! Câu trả lời chính xác! (Mặc dù 'bool (1-True)' là một chút chậm hơn sau đó 'không True') –

+0

Có thể, có. Hữu ích? Không có khả năng! Có rất nhiều thứ xấu xí mà bạn có thể làm với hầu hết mọi ngôn ngữ, nhưng điều này chỉ gây nhầm lẫn cho hầu hết người đọc. Có lẽ trong một bối cảnh rất đặc biệt, điều này có thể có ý nghĩa ... – BuvinJ

Các vấn đề liên quan