2015-05-31 3 views
90

Итак, я попробовал «злую» вещь, которую Нед Дейли упомянул в своем ответе here. Теперь у меня есть тип True теперь всегда False. Как бы это изменить в интерактивном окне?Как отменить True = False в интерактивном режиме python?

Вещь не делать:

True = False 

С Тру теперь полностью подменяется Ложные, как представляется, не быть очевидный способ резервного пути. Есть ли модуль, правда приходит от что я могу сделать что-то вроде:

True = <'module'>.True 
+21

Все это делает создать локальную переменную с именем 'true', которая скрывает встроенную константу. «Настоящий» «Истинный» не затрагивается и все еще может быть создан, например. с функцией '(1 == 1)' или 'bool()'. Он также живет в '__builtins __. True'. – Kevin

+14

Обратите внимание, что это невозможно в Python 3, который рассматривает слова «True» и «False» как ключевые слова. –

ответ

137

Вы можете просто del пользовательское имя, чтобы установить его обратно по умолчанию:

>>> True = False 
>>> True 
False 
>>> del True 
>>> True 
True 
>>> 
+4

Итак, команда 'True = False' фактически создает новое локальное имя, которое затеняет ключевое слово, а не заменяет собой переменную? И это просто очищает его? – jpmc26

+10

@ jpmc26 - Да, это правильно. Однако обратите внимание, что 'True' и' False' не являются ключевыми словами в Python 2.x; они встроены. Вот почему это возможно. В Python 3.x, где 'True' и' False' * являются * ключевыми словами, 'True = False' поднимет синтаксическую ошибку, потому что вы не можете назначить ключевое слово. – iCodez

+5

Интересно отметить, что это не удается, если '__builtins __. True' был изменен, как намекнул в ответ от @simonwo. – 101

47

Это работает:

>>> True = False 
>>> True 
False 
>>> True = not False 
>>> True 
True 

, но не удалось, если False был также использован. Таким образом, это лучше:

>>> True = not None 

в None не могут быть переназначены.

Они также вычисляться True независимо от того, True был переведен на False, 5, 'foo', None и т.д.:

>>> True = True == True # fails if True = float('nan') 
>>> True = True is True 
>>> True = not True or not not True 
>>> True = not not True if True else not True 
>>> True = not 0 
+0

Насколько мне нравится, я думаю, что iCodez является более общим решением для этих проблем с переопределением типов. – horta

+0

Тем более, что это разваливается, если вы делаете «True», False = False, True'. – Kevin

+2

@Kevin 'True, False = not True, True' исправляет это. Пока у вас есть ссылка на «Истинный» или «Ложный», вы можете вывести другое, что кажется. – 101

12

Просто сделай это:

True = bool(1) 

Или, потому что булевы являются по существу целые числа:

True = 1 
+1

'bool = int'. К сожалению! 'bool (1) → 1'. – sleblanc

+1

@sebleblanc Я имел в виду, что они работают одинаково – Loovjo

+0

И я имею в виду, что ваш ответ не работает во всех случаях, точно так же, как у фигов и ответов симонво есть подводные камни. Если bool также был переопределен, вы не можете получить значение True из этой функции. – sleblanc

17

Для полноты: Кевин упоминает, что вы могли бы также принести реальный True из __builtins__:

>>> True = False 
>>> True 
False 
>>> True = __builtins__.True 
>>> True 
True 

Но True также могут быть переопределены:

>>> __builtins__.True = False 
>>> __builtins__.True 
False 

Так лучше идти с одним из другого опции.

37

Другой способ:

>>> True = 1 == 1 
>>> False = 1 == 2 
+1

Это довольно творческое, но простое решение. Я впечатлен. –

2

Решения, которые не используют ни одного литералов объектов, но которые столь же прочен, как 1 == 1. Конечно, вы можете определить False после определения True, поэтому я поставлю решения в виде полупар.

def f(): pass 
class A(): pass 
True = not f() 
False = A != A 
False = not (lambda:_).__gt__(_) 
True = not (lambda:_).__doc__ 
Смежные вопросы