我注意到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会这样做?这是记录还是可配置的?
答案 0 :(得分:8)
这是强制引用的便捷方法,请参阅文档:https://ipython.readthedocs.io/en/stable/interactive/reference.html#automatic-parentheses-and-quotes
来自文档:
您可以使用强制自动引用函数的参数, 要么 ;作为一行的第一个字符。例如:
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]:
''
我无法看到任何允许你覆盖它的地方,我可能错了,但它看起来像是硬编码的东西。
修改强>
好的,我发现了mail帖子,您可以通过添加(或创建,如果它不存在)以下内容.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='