2015-02-24 13 views
8

Zauważyłem, że IPython ma pewne dziwne zachowanie składni dla składni, która nie jest legalnym pythonem.Dlaczego ,, b = 1,2,3 jest analizowany jako (', b', '=', '1,2,3') w IPythonie?

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

Coś podobnego dzieje się średnikiem, ale nie jest to podział na krotki.

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

Choć wygląda ; oznacza, że ​​reszta linii jest traktowany jako ciąg dosłownym, to nie zawsze tak jest:

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 

Dlaczego ipython to zrobić? Czy jest to udokumentowane lub konfigurowalne?

Odpowiedz

7

Jest to metoda wygoda dla zmuszając cytat, zobacz docs: http://ipython.org/ipython-doc/2/interactive/reference.html

Od docs:

Można wymusić automatyczne podając argumentów funkcji, używając, lub; jako pierwszy znak linii. Na przykład:

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

Jeśli użyć ';' cała argumentacja jest cytowany jako jeden ciąg znaków, a '' podziały na spacji:

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

Zauważ, że "," lub ";" MUSZĄ być pierwszą postacią na linii! To nie praca:

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

Na przykład tylko ; wyprowadza pusty ciąg:

In [260]: 

; 
Out[260]: 
'' 

Jak robi tylko przecinek ,:

In [261]: 

, 
Out[261]: 
'' 

nie mogę zobacz gdziekolwiek, co pozwala ci to zmienić, może się mylę, ale wygląda na coś, co jest zakodowane.

EDIT

OK znalazłem mail post o tym, można go wyłączyć poprzez dodanie (lub stworzenie jeśli nie istnieje) dodaje się do .ipython/profile_default/static/custom/custom.js, to niesprawdzone:

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

Odnośnie ostatniego punktu, dlaczego ,,b = 1,2,3 jest leczony inaczej wygląda biała przestrzeń wprowadza jakąś przerwę, która następnie zamienia to na krotki:

In [9]: 

,,b = 

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

porównać bez spacji:

+0

myślę JS tylko dla przeglądarek (Byłbym bardzo zaskoczony, gdyby ipython biegały kodu JavaScript w linii poleceń). – nneonneo

+0

@nneonneo to prawda, spróbuję i wykopię jedną dla terminala IPython – EdChum

+0

Dzięki, to wyjaśnia ', foo' i'; foo', ale nie rozumiem, dlaczego ',, b' jest traktowane inaczej i nie jako wywołanie funkcji. –

Powiązane problemy