gpt4 book ai didi

python - 往返 IPython transform_cell

转载 作者:行者123 更新时间:2023-12-04 11:26:03 27 4
gpt4 key购买 nike

考虑以下示例:

>>> 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)!!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
    注意:案例 foo=!!cmd不被上述函数处理,因为它是无效的 ipython 语法。

    关于python - 往返 IPython transform_cell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67802505/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com