我们可以使用%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命令。那可能吗?我们怎样才能做出这种别名?
我在交互式解释器中工作了很多,这可以为我节省很多我经常重复的命令,并且还可以防止一些常见的拼写错误。
答案 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时该宏将自动可用。
但是,宏不接受参数。因此,在选择定义宏之前,请记住这一点。