2015-02-24 7 views
8

Ho notato che IPython ha un parsing molto strano che si comporta per la sintassi che non è Python legale.Perché "b = 1,2,3 analizzato come (', b', '=', '1,2,3') in IPython?

In [1]: ,,b = 1,2,3 
Out[1]: (',b', '=', '1,2,3') 

C'è qualcosa di simile in corso con il punto e virgola, ma non si sta dividendo in una tupla.

In [4]: ;;foo = 1;2;3 
Out[4]: ';foo = 1;2;3' 

Mentre sembra che ; significa il resto della linea è trattata come una stringa letterale, questo non è sempre il caso:

In [5]: ,foo 
--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 
<ipython-input-5-f2137ad20ab5> in <module>() 
----> 1 foo("") 

NameError: name 'foo' is not defined 

In [6]: ;foo 
--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 
<ipython-input-6-f2137ad20ab5> in <module>() 
----> 1 foo("") 

NameError: name 'foo' is not defined 

Perché IPython fare questo? È documentato o configurabile?

risposta

7

E 'un metodo comodo per forzare la citazione, si veda la documentazione: http://ipython.org/ipython-doc/2/interactive/reference.html

Dalla documentazione:

è possibile forzare automatica citando di argomenti di una funzione utilizzando, o; come il primo personaggio di una linea. Per esempio:

In [1]: ,my_function /home/me # becomes my_function("/home/me") 

Se si utilizza ';' l'intero argomento viene citato come una singola stringa, mentre '' spezza negli spazi vuoti:

In [2]: ,my_function a b c # becomes my_function("a","b","c") 
In [3]: ;my_function a b c # becomes my_function("a b c") 

Nota che il ',' o ';' DEVE essere il primo carattere sulla linea! Questo non lavoro:

In [4]: x = ,my_function /home/me # syntax error 

Ad esempio solo ; emette una stringa vuota:

In [260]: 

; 
Out[260]: 
'' 

Come anche solo una virgola ,:

In [261]: 

, 
Out[261]: 
'' 

non posso vedi da qualche parte che ti permette di scavalcare questo, potrei sbagliarmi ma sembra qualcosa in cui è difficile codificare.

EDIT

OK ho trovato un post mail su questo, si può spegnerlo con l'aggiunta (o la creazione se non esiste) le seguenti operazioni per .ipython/profile_default/static/custom/custom.js, questo non è testato:

if (IPython.CodeCell) { 
    IPython.CodeCell.options_default.cm_config.autoCloseBrackets = false; 
} 

Per quanto riguarda l'ultimo punto sul perché ,,b = 1,2,3 viene trattato in modo diverso sembra che lo spazio bianco è l'introduzione di una sorta di pausa, che poi si trasforma questo in una tupla:

In [9]: 

,,b = 

Out[9]: 
(',b', '=') 

confronto senza spazi:

+0

Credo che il JS è solo per i browser (Sarei molto sorpreso se IPython erano in esecuzione il codice JavaScript alla riga di comando). – nneonneo

+0

@nneonneo che è vero, proverò a scavare per uno per il terminale IPython – EdChum

+0

Grazie, questo spiega il ', foo' e'; foo' ma non vedo perché ', b' è trattato in modo diverso e non come una chiamata di funzione. –

Problemi correlati