我想在(我的安装)IPython中添加一些语法更改。例如,我可能希望使用\+
来表示operator.add
。我想我可以插入一些代码来处理输入并将其转换为实际的(I)Python,然后IPython可以自己进行处理。但我不知道该代码放在哪里。
(免责声明:不要将其用于生产代码,也不要用于其他人查看/使用的代码。)
答案 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())
请注意,这是基于字符串的。此挂钩在未评估的上下文中执行。这意味着您无法根据a
或b
的值进行条件转换。在这种情况下,魔术最适合你的需要。
此外,在解析输入字符串时必须小心。在我的示例中,由于拆分,以下内容被\+ (a * b) c
打破。在这种情况下,您将需要一个标记化工具。 IPython提供了一个TokenInputTransformer
。它的工作方式与StatelessInputTransformer
类似,但它使用令牌列表而不是整行来调用。
只需运行此代码即可添加过滤器。如果您希望在启动IPython时可以使用它,可以将其保存为.py
或.ipy
文件并将其放入
~/.ipython/profile_*/startup
https://ipython.org/ipython-doc/dev/config/inputtransforms.html