如何解决往返 IPython transform_cell
考虑以下示例:
>>> from IPython.core.inputtransformer2 import TransformerManager
>>> src = """\
... foo = !ls
... !!ls
... """
>>> TransformerManager().transform_cell(src)
"foo = get_ipython().getoutput('ls')\nget_ipython().getoutput('ls')\n"
!ls
和 !!ls
都变成了 get_ipython().getoutput('ls')
。
如果我只看到TransformerManager().transform_cell
的输出,有没有办法找回原始来源?
有没有办法判断get_ipython().get_output(<some string>)
来自!<some string>
还是!!<some string>
?
解决方法
让我们仔细看看 TransformerManager
如何在幕后工作以识别 ipython 特殊命令:
TransformerManager
尝试将每一行与以下结构之一匹配:
- 魔法任务 (
%%my ipython magic
) - 系统分配 (
foo = !cmd
) - 转义命令(
!cmd
和!!cmd
)
系统分配
在 system assigns 的情况下,!
符号后的第一个 =
被剥离,后面的任何内容都用作 get_ipython().getoutput
的参数。
例如: foo = !ls
-> foo = get_ipython().getoutput('ls')
转义命令
对于所谓的“escaped commands”,即没有赋值的系统调用,!cmd
之间是有区别的,它被翻译成 get_ipython().system(cmd)
和 {{1 }},变成!!cmd
。
因此,我们可以通过使用一些基本的正则表达式来计算用于检测赋值是否存在的感叹号的数量:
get_ipython().getoutput(cmd)
注意:import re
def get_number_exclamation_marks(transformed_line):
"""
Takes the output of TransformerManager for one ipython line,and returns the
number of exclamation marks used in the system call. If no system call
is present,returns 0.
"""
if re.search(r"= *get_ipython\(\)\.getoutput\(",transformed_line)\
or re.search(r"get_ipython\(\)\.system\(",transformed_line):
return 1
if re.search(r"get_ipython\(\)\.getoutput\(",transformed_line):
return 2
return 0
的情况不被上述函数处理,因为它是无效的 ipython 语法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。