2015-05-31 10 views
90

Also versuchte ich das "böse" Ding, das Ned Deily in seiner Antwort here erwähnt. Nun habe ich, dass der Typ True nun immer False ist. Wie würde ich das im interaktiven Fenster umkehren?Wie mache ich im interaktiven Python-Modus True = False rückgängig?

Sache nicht zu tun:

True = False 

Seit Wahr ist nun vollständig überschrieben mit falschem worden, es scheint nicht zu offensichtlich, dass die Art und Weise zu sein zu-Spur zurück. Gibt es ein Modul, das Wahre kommt, dass ich so etwas tun kann:

True = <'module'>.True 
+21

All dies tut, ist eine lokale Variable erstellen namens 'true', die die eingebaute Konstante versteckt. Das "echte" "Wahr" ist nicht betroffen und kann immer noch z.B. mit '(1 == 1)' oder der 'bool()' Funktion. Es lebt auch in "__builtins __. True". – Kevin

+14

Beachten Sie, dass dies in Python 3 nicht möglich ist, da es "True" und "False" als Schlüsselwörter behandelt. –

Antwort

137

Sie können einfach del Ihren individuellen Namen es zurück zum Standard festlegen:

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

Also erzeugt der 'True = False' Befehl tatsächlich einen neuen, lokalen Namen, der das Schlüsselwort schattiert, anstatt eine Variable tatsächlich zu ersetzen? Und das räumt einfach auf? – jpmc26

+10

@ jpmc26 - Ja, das ist richtig. Beachten Sie jedoch, dass "True" und "False" keine Schlüsselwörter in Python 2.x sind. Sie sind gebaut. Deshalb ist das möglich. In Python 3.x, wo 'True' und' False' * * Schlüsselwörter sind, würde 'True = False' einen Syntaxfehler verursachen, weil Sie einem Schlüsselwort nicht zuweisen können. – iCodez

+5

Interessant zu bemerken, dass dies fehlschlägt, wenn '__builtins __. True' geändert wurde, wie in der Antwort von @simonwo angedeutet. – 101

47

Dies funktioniert:

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

aber schlägt fehl, wenn auch False mit fiedled wurde. Daher ist dies besser:

>>> True = not None 

als None nicht neu zugewiesen werden.

Diese auch True unabhängig davon, ob True auswerten hat False neu zugewiesen worden ist, 5, 'foo', None, etc:

>>> 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

So sehr ich das mag, ich denke, iCodez ist die allgemeinere Lösung für diese Override-Probleme. – horta

+0

Besonders, da dies auseinander fällt, wenn Sie stattdessen "True, False = False, True" tun. – Kevin

+2

@Kevin 'True, False = nicht True, True' behebt das. Solange Sie einen Bezug auf "True" oder "False" haben, können Sie den anderen, den es scheint, ableiten. – 101

12

dies nur tun:

True = bool(1) 

Oder weil booleans sind im Wesentlichen ganze Zahlen:

True = 1 
+1

'bool = int'. Hoppla! 'bool (1) → 1'. – sleblanc

+1

@sebleblanc Ich meinte, dass sie in der gleichen Weise funktionieren – Loovjo

+0

Und ich meine, dass Ihre Antwort nicht in allen Fällen funktioniert, in der gleichen Weise, dass Feigen und Simonwos Antworten Fallstricke haben. Wenn bool ebenfalls neu definiert wurde, können Sie von dieser Funktion nicht den Wert "True" erhalten. – sleblanc

17

Der Vollständigkeit halber: Kevin erwähnt, dass Sie auch die reale True von __builtins__ holen konnte:

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

besser mit einem anderen gehen Also:

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

Aber das True kann auch außer Kraft gesetzt werden, Optionen.

37

Ein anderer Weg:

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

Das ist eine ziemlich kreative, aber einfache Lösung. Ich bin beeindruckt. –

2

Lösungen, die keine Objektliterale verwenden, sondern sind so haltbar wie 1 == 1. Natürlich können Sie Falsch definieren, sobald True definiert ist, also werde ich Lösungen als halbe Paare liefern.

def f(): pass 
class A(): pass 
True = not f() 
False = A != A 
False = not (lambda:_).__gt__(_) 
True = not (lambda:_).__doc__ 
Verwandte Themen