2015-04-07 24 views
13

Volevo vedere se era possibile definire nuove parole chiave o, come vengono chiamate in WAT's Destroy All Software talk quando si parla di Ruby, parole nude, in Python.Parole vuote/nuove parole chiave in Python

Mi è venuta una risposta che non riuscivo a trovare altrove, quindi ho deciso di condividerla Q & Uno stile su StackOverflow.

+1

Qualcuno si preoccupa di spiegare perché stanno facendo downvoting/votando per chiudere? Sto condividendo conoscenze che potrebbero essere utili per chiunque cerchi di aggiungere nuove parole chiave in Python senza dover effettivamente modificare il codice sorgente dell'interprete e ricompilarlo. Questo potrebbe essere usato impropriamente? Quasi certamente lo sarà. Ma se vuoi davvero farlo, allora ti ho fornito questo per te. E se non vuoi farlo, allora vai avanti - non c'è bisogno di downvotare o votare per chiudere. – ArtOfWarfare

+3

Un caso d'uso interessante per questo sarebbe l'implementazione di un'interfaccia a riga di comando interattiva senza input(). In questo modo, hai la piena potenza di una shell interattiva e di un cli allo stesso tempo. È un anti-pattern, ma è interessante. – RobotHumans

+4

Sei troppo avanti rispetto alla curva: ecco perché ... **; -) ** Non è inventando un tablet che farai soldi ma perfezionandolo e chiamandolo iPad, lo farai, quindi 1 up-vote (che neutralizzerà 5 down-vote) **>: -) ** – Fabby

risposta

12

Ho provato solo questo nel REPL, al di fuori di qualsiasi blocco, finora. Potrebbe essere possibile farlo funzionare anche altrove.

ho messo nel mio file di avvio python:

def bareWordHandler(type_, value, traceback_): 
    if isinstance(value, SyntaxError): 
     import traceback 

     # You can probably modify this next line so that it'll work within blocks, as well as outside them: 
     bareWords = traceback.format_exception(type_, value, traceback_)[1].split() 

     # At this point we have the raw string that was entered. 
     # Use whatever logic you want on it to decide what to do. 
     if bareWords[0] == 'Awesome': 
      print(' '.join(bareWords[1:]).upper() + '!') 
      return 
    bareWordsHandler.originalExceptHookFunction(type_, value, traceback_) 

import sys 
bareWordsHandler.originalExceptHookFunction = sys.excepthook 
sys.excepthook = bareWordsHandler 

rapidi sessione REPL afterwords dimostrazione:

>>> Awesome bare words 
BARE WORDS! 

Utilizzare in modo responsabile.

Modifica: ecco un esempio più utile. Ho aggiunto una parola chiave run.

if bareWords[0] == 'from' and bareWords[2] == 'run': 
     atPrompt.autoRun = ['from ' + bareWords[1] + ' import ' + bareWords[3].split('(')[0], 
          ' '.join(bareWords[3:])] 
     return 

atPrompt.autoRun è un elenco di variabili che, quando viene visualizzato il mio messaggio, verrà automaticamente controllato e reimmessa. Così, per esempio, posso fare questo:

>>> from loadBalanceTester run loadBalancerTest(runJar = False) 

E questo viene interpretato come:

from loadBalancerTest import loadBalancerTest 
loadBalancerTest(runJar = False) 

E 'un po' come un macro - è comune per me di voler fare questo genere di cose, così ho deciso di aggiungere una parola chiave che mi consenta di farlo in un numero inferiore di tasti.

+1

Questo è .... terrificante o_O – Shayne

+0

@Shayne Penso che questo genere di cose siano da dove nascono nuove lingue. Fai cose brutte e cattive nelle lingue esistenti, finché alla fine decidi di trasformarlo nella sua nuova lingua ufficiale. IE, ho sentito C++ ha iniziato la vita come un mucchio di macro per rendere più semplice la progettazione di OO in C. – ArtOfWarfare

+4

Questa è la mia risposta SO preferita. Questo è * tale * un abuso di un linguaggio altrimenti sensibile e sintatticamente rigoroso, +1 – cat

Problemi correlati