Почему,,b = 1,2,3 анализируется как (',b', '=', '1,2,3') в IPython?
Я заметил, что IPython имеет очень странный синтаксический анализ поведения, который не является допустимым Python.
In [1]: ,,b = 1,2,3
Out[1]: (',b', '=', '1,2,3')
Нечто подобное происходит с точками с запятой, но оно не разбивается на кортежи.
In [4]: ;;foo = 1;2;3
Out[4]: ';foo = 1;2;3'
Хотя это выглядит как ;
означает, что остальная часть строки рассматривается как буквальная строка, это не всегда так:
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
Почему IPython делает это? Это задокументировано или настраивается?
1 ответ
Это удобный метод для принудительного цитирования, см. Документы: http://ipython.org/ipython-doc/2/interactive/reference.html
Из документов:
Вы можете включить автоматическое цитирование аргументов функции, используя, или; в качестве первого символа строки. Например:
In [1]: ,my_function /home/me # becomes my_function("/home/me")
Если вы используете ';' весь аргумент заключен в одну строку, а ',' разделяется на пробел:
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")
Обратите внимание, что ',' или ';' ДОЛЖЕН быть первым символом в строке! Это не сработает:
In [4]: x = ,my_function /home/me # syntax error
Например просто ;
выводит пустую строку:
In [260]:
;
Out[260]:
''
Как и просто запятая ,
:
In [261]:
,
Out[261]:
''
Я не вижу нигде, что позволяет вам переопределить это, я могу ошибаться, но похоже, что это жестко закодировано.
РЕДАКТИРОВАТЬ
Хорошо, я нашел сообщение об этом, вы можете отключить его, добавив (или создав, если он не существует) следующее .ipython/profile_default/static/custom/custom.js
, это не проверено:
if (IPython.CodeCell) {
IPython.CodeCell.options_default.cm_config.autoCloseBrackets = false;
}
Что касается вашего последнего пункта о том, почему ,,b = 1,2,3
обрабатывается по-разному, похоже, что пустое пространство вводит какой-то разрыв, который затем превращает это в кортеж:
In [9]:
,,b =
Out[9]:
(',b', '=')
сравнить без пробелов:
In [10]:
,,b=
Out[10]:
',b='