10

我们可以使用魔法函数在 ipython中定义一个别名,如下所示:%alias

>>> d
NameError: name 'd' is not defined
>>> %alias d date
>>> d
Fri May 15 00:12:20 AEST 2015

date当您输入dipython 时,这会转义到 shell 命令。

但我想定义一个别名来在当前解释器范围内执行一些python代码,而不是 shell 命令。那可能吗?我们如何才能制作这种别名?

我经常在交互式解释器中工作,这可以节省很多我发现自己经常重复的命令,还可以防止一些常见的拼写错误。

4

2 回答 2

8

执行此操作的正常方法是简单地编写一个 python 函数,使用def. 但是如果你想给一个语句起别名,而不是一个函数调用,那么它实际上有点棘手。

您可以通过编写自定义魔术函数来实现这一点。这是一个示例,它在 REPL中有效地将import语句别名为 。get

from IPython.core.magic_arguments import argument, magic_arguments

@magic_arguments()
@argument('module')
def magic_import(self, arg):
    code = 'import {}'.format(arg)
    print('--> {}'.format(code))
    self.shell.run_code(code)

ip = get_ipython()
ip.define_magic('get', magic_import)

现在可以执行get别名为语句的import语句。

演示:

In [1]: get json
--> import json

In [2]: json.loads
Out[2]: <function json.loads>

In [3]: get potato
--> import potato
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<string> in <module>()

ImportError: No module named potato

In [4]: 

当然,这可以扩展到任意 python 代码,并且也支持可选参数

于 2015-05-14T14:39:34.007 回答
1

我不知道 IPython 什么时候提供宏。现在您可以简单地执行此操作:

ipy = get_ipython()
ipy.define_macro('d', 'date')

您可以将此代码放入位于 中的任何文件中~/.ipython/profile_default/startup/,然后启动 IPython 时该宏将自动可用。

但是,宏不接受参数。因此,在您选择定义宏之前请记住这一点。

于 2020-07-12T04:15:14.010 回答