Почему,,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='
Другие вопросы по тегам