只输入一个逗号 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")
今天我在互动环节误输入了一个逗号
输入:
,
而且我奇怪地注意到它没有 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")