只输入一个逗号 returns 奇怪的行为

Inputting just a comma returns strange behaviour

今天我在互动环节误输入了一个逗号
输入:

,

而且我奇怪地注意到它没有 return 错误,而是:
输出

''

所以我探索了一下这种行为并尝试了一些随机的东西,它似乎创建了字符串元组,但似乎无法与这些对象交互:

, 'foo' bar 1 x 

returns:

("'foo'", 'bar', '1', 'x')

尝试分配这些元组或进行一些 == 检查并没有真正起作用,但是 return 错误。
我找不到有关此行为的任何答案或文档。有人知道这里发生了什么吗?

编辑:我在 VSCode 交互式 window 和 IPython 中使用 Python 3.9.8 和 运行。正如有人在评论中指出的那样,这不是终端 运行 时的行为

我有 python 3.9.0 并观察到相同的行为。

我也在 juptyer notebook 中尝试了同样的操作,它 returns 相同。

但是,这没有上下文,因为当我尝试将此“元组”分配给变量时,它正确 抛出错误。

所以看起来这个“伪”元组在 python...

中没有意义,或者至少是无效的语法

我还注意到刚刚发布的 @a_guest 的回答,它更加清晰。

这是 EscapedCommand class, specifically here. It's not part of autocall (details see below) which is handled by prefilter.AutoHandler 执行的输入转换。我找不到任何关于“转义命令”的 public 文档,class' 文档字符串只是提到它是一个 " 转义命令的转换器,例如 %foo!foo,或 /foo"。所以我的印象是像 , a b 这样的输入转换是一些其他功能的(意外的)副作用,因为它没有 publicly 记录并且似乎没有任何用处。

我们可以通过导入相应的模块来请求当前的IPythonshell,然后查看是什么组件修改了输入:

In [1]: import IPython

In [2]: shell = IPython.get_ipython()

In [3]: %autocall
Automatic calling is: Smart

In [4]: shell.prefilter(',f a b')  # autocall (note the function name 'f'), not applied since there is no callable `f` in the global namespace
Out[4]: ',f a b'

In [5]: f = lambda x,y: x+y

In [6]: shell.prefilter(',f a b')  # autocall (note the function name 'f'), now it works
------> f("a", "b")
Out[6]: 'f("a", "b")'

In [7]: shell.prefilter(', a b')  # not identified as autocall --> remains unchanged
Out[7]: ', a b'

In [8]: shell.transform_cell(', a b')  # however, it gets transformed by `EscapedCommand`
Out[8]: '("a", "b")\n'

要使自动呼叫工作,我们首先必须通过“魔法”命令激活它%autocall。此外,指定的函数名称 (f) 必须存在于命名空间中并且可以调用。 %quickref 简要概述了自动呼叫功能(向下滚动到“自动呼叫”):

Autocall:

f 1,2            : f(1,2)  # Off by default, enable with %autocall magic.
/f 1,2           : f(1,2) (forced autoparen)
,f 1 2           : f("1","2")
;f 1 2           : f("1 2")