为什么,b=1,2,3在IPython中被解析为(';,b';,';=';,';1,2,3';)?
我注意到IPython对于非合法Python的语法有一些非常奇怪的解析行为为什么,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 -----------------------------------------------
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='