如何编写一个在python而不是shell中执行的ipython别名?

时间:2015-05-14 14:39:34

标签: python macros ipython alias ipython-magic

我们可以使用%alias魔术函数在ipython中定义alias,如下所示:

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

当您在ipython中键入date时,这会转义到shell命令d

但我想在当前的解释器范围中定义一个别名来执行一些 python 代码,而不是shell命令。那可能吗?我们怎样才能做出这种别名?

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

2 个答案:

答案 0 :(得分:6)

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

您可以通过编写自定义magic功能来实现此目的。这是一个示例,它在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代码和optional arguments are supported aswell

答案 1 :(得分:1)

我不知道自从IPython何时提供宏。现在,您只需执行以下操作即可:

export default function CategoryList(props: Props) {
  let { params } = useRoute<StackRouteProp<'Home'>>()

  const [currentCategory, setCategory] = useState({categories: Categories[0]});
  const canSet = useRef(true)

  useEffect(() => {
    if (params && canSet.current) {
      setCategory({ categories: params.categories })
      canSet.current = false
    } else {
      canSet.current = true
    }
  }, [params])

您可以将此代码放入ipy = get_ipython() ipy.define_macro('d', 'date') 中的任何文件中,然后在启动IPython时该宏将自动可用。

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