向IPython添加语法?

时间:2015-06-14 21:49:38

标签: python ipython

我想在(我的安装)IPython中添加一些语法更改。例如,我可能希望使用\+来表示operator.add。我想我可以插入一些代码来处理输入并将其转换为实际的(I)Python,然后IPython可以自己进行处理。但我不知道该代码放在哪里。

(免责声明:不要将其用于生产代码,也不要用于其他人查看/使用的代码。)

1 个答案:

答案 0 :(得分:2)

以下是如何将"\+ a b"转换为"a + b"的示例。

from IPython.core.inputtransformer import StatelessInputTransformer

@StatelessInputTransformer.wrap
def my_filter(line):
    words = line.split()
    if line.startswith(r'\+ ') and len(words) == 3:
        return '{} + {}'.format(*words[1:])
    return line

ip = get_ipython()
ip.input_transformer_manager.physical_line_transforms.insert(0, my_filter())

请注意,这是基于字符串的。此挂钩在未评估的上下文中执行。这意味着您无法根据ab的值进行条件转换。在这种情况下,魔术最适合你的需要。

此外,在解析输入字符串时必须小心。在我的示例中,由于拆分,以下内容被\+ (a * b) c打破。在这种情况下,您将需要一个标记化工具。 IPython提供了一个TokenInputTransformer。它的工作方式与StatelessInputTransformer类似,但它使用令牌列表而不是整行来调用。

只需运行此代码即可添加过滤器。如果您希望在启动IPython时可以使用它,可以将其保存为.py.ipy文件并将其放入 ~/.ipython/profile_*/startup

https://ipython.org/ipython-doc/dev/config/inputtransforms.html