为什么,b=1,2,3在IPython中被解析为(';,b';,';=';,';1,2,3';)?

为什么,b=1,2,3在IPython中被解析为(';,b';,';=';,';1,2,3';)?,python,ipython,Python,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 -----------------------------------------------

我注意到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
[5]中的
:,foo
---------------------------------------------------------------------------
NameError回溯(最近一次呼叫上次)
在()
---->1 foo(“”)
NameError:未定义名称“foo”
在[6]中:;福
---------------------------------------------------------------------------
NameError回溯(最近一次呼叫上次)
在()
---->1 foo(“”)
NameError:未定义名称“foo”

为什么IPython会这样做?这是有文档记录的还是可配置的?

这是一种方便的强制报价方法,请参见文档:

从文档中:

您可以使用, 或作为行的第一个字符。例如:

如果 你用“;”整个参数被引用为单个字符串,而“,” 空格上的拆分:

注意 “,”或“;”必须是行中的第一个字符!这不会 工作:

例如,
输出一个空字符串:

In [260]:

;
Out[260]:
''
就像逗号一样,

In [261]:

,
Out[261]:
''
我看不到任何地方允许你覆盖这个,我可能错了,但它看起来像是硬编码的东西

编辑

好的,我找到了一篇关于这个的帖子,你可以通过添加(或创建,如果它不存在)以下内容来关闭它:
.ipython/profile\u 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='

我认为JS仅适用于浏览器(如果IPython在命令行上运行JavaScript代码,我会非常惊讶)。@nneonno这是真的,我将尝试为终端iPythonTanks挖掘一个,这解释了
、foo
;foo
,但我不明白为什么
,b
被区别对待,而不是作为函数调用。您是否特别询问
,b=1,2,3
?看起来,b后面的空白将使它变成一个元组,例如
,b=1,2,3
将整个语句作为string@WilfredHughes我认为它试图进行一个函数调用,并且会感到困惑,因为它只需要一个前导逗号,而不是两个。
if (IPython.CodeCell) {
    IPython.CodeCell.options_default.cm_config.autoCloseBrackets = false;
}
In [9]:

,,b =

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

,,b=
Out[10]:
',b='