2015-05-31 20 views
90

Così ho provato la cosa "cattiva" di cui parlava Ned Deily nella sua risposta here. Ora ho che il tipo True ora è sempre Falso. Come posso invertire questo all'interno della finestra interattiva?Come annullare True = False in modalità interattiva Python?

Cosa non fare:

True = False 

Dal Vero è stato ora completamente ignorato con false, non sembra essere un modo ovvio per back-track. C'è un modulo che vera viene da che io possa fare qualcosa di simile:

True = <'module'>.True 
+21

Tutto questo non fa altro che creare una variabile locale chiamata 'true', che nasconde la costante incorporato. Il "vero" 'Vero' non è influenzato e può ancora essere creato ad es. con '(1 == 1)' o la funzione 'bool()'. Vive anche in "__builtins __. True". – Kevin

+14

Nota che questo non è possibile in Python 3, che considera 'True' e' False' come parole chiave. –

risposta

137

Si può semplicemente del tuo nome personalizzato per riportarlo al valore predefinito:

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

Quindi il comando 'True = False' crea effettivamente un nuovo nome locale che ombreggia la parola chiave, piuttosto che sostituire una variabile in realtà? E questo lo pulisce? – jpmc26

+10

@ jpmc26 - Sì, è corretto. Si noti tuttavia che 'True' e' False' non sono parole chiave in Python 2.x; sono buildins. Questo è il motivo per cui è possibile. In Python 3.x, dove 'True' e' False' * sono * parole chiave, 'True = False' genererebbe un errore di sintassi perché non è possibile assegnare a una parola chiave. – iCodez

+5

È interessante notare che ciò non riesce se "__builtins __. True" è stato modificato, come suggerito nella risposta di @simonwo. – 101

47

Questo funziona:

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

ma non funziona se anche False è stato ingannato. Quindi questo è meglio:

>>> True = not None 

come None non può essere riassegnato.

Questi valutare anche True indipendentemente dal fatto che True è stato riassegnato a False, 5, 'foo', None, ecc:

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

Per quanto mi piaccia, penso che iCodez sia la soluzione più generale a questi problemi di tipo override. – horta

+0

Tanto più che questo va in pezzi se si esegue "Vero, Falso = Falso, Vero" invece. – Kevin

+2

@Kevin 'True, False = non True, True' risolve questo problema. Finché hai un riferimento a "Vero" o "Falso", puoi dedurre che l'altro sembra. – 101

12

solo fare questo:

True = bool(1) 

Oppure, perché booleani sono essenzialmente numeri interi:

True = 1 
+1

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

+1

@sebleblanc intendevo che funzionano allo stesso modo – Loovjo

+0

E intendo che la tua risposta non funziona in tutti i casi, nello stesso modo in cui le risposte di fichi e simonwo hanno delle insidie. Se anche bool è stato ridefinito, non è possibile ottenere il valore 'True' da quella funzione. – sleblanc

17

Per completezza: Kevin menzioni che si potrebbe anche prendere il vero True da __builtins__:

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

Ma che True può anche essere ignorato:

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

Quindi meglio andare con uno degli altri opzioni.

37

Un altro modo:

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

Questa è una soluzione piuttosto creativa, ma semplice. Sono impressionato. –

2

Le soluzioni che utilizzano non letterali oggetto, ma sono durevoli quanto 1 == 1. Naturalmente, è possibile definire False una volta definito True, quindi fornirò le soluzioni come mezze coppie.

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