我定义了一个自定义iPython magic,如下所示:
%%writefile pymagic.py
from IPython.core import magic_arguments
@magic_arguments.magic_arguments()
@magic_arguments.argument('--include', '-i', nargs='+', help='Pass file patterns to include')
@magic_arguments.argument('--omit', '-o', nargs='+', help='Pass file patterns to omit')
def pymagic(line, cell):
args = magic_arguments.parse_argstring(pymagic, line)
ip = get_ipython()
out = ip.run_cell(cell)
return args, 'test'
def load_ipython_extension(ipython):
ipython.register_magic_function(pymagic, magic_kind='cell')
我可以这样使用它:
%load_ext pymagic
%%pymagic --include /home/test/a* --omit /home/test/b*
a = [1,2,3]
# Output: (Namespace(include=['/home/test/a*'], omit=['/home/test/b*']), 'test')
现在,我可以不用@magic_参数装饰器来完成这项工作吗
我之所以希望这样做,是因为我必须避免IPython模块的全局导入,因为它们会导致一些其他意外问题。这意味着我必须将“from IPython.core import magic_arguments”导入从全局范围移开,最好是在load_python_extension()函数中
我正在考虑实现这样的目标,这将使我摆脱Ipython.core的全球导入: (下面的代码片段只是一个粗略的描述,语法不正确)
def pymagic(line, cell):
args = magic_arguments.parse_argstring(pymagic, line)
ip = get_ipython()
out = ip.run_cell(cell)
return args, 'test'
def load_ipython_extension(ipython):
from IPython.core import magic_arguments
magic_arguments.add_magic_arg(func=pymagic, arg_attrs=('--include', '-i', nargs='+', help='Pass file patterns to include'))
magic_arguments.add_magic_arg(func=pymagic, arg_attrs=('--omit', '-o', nargs='+', help='Pass file patterns to omit'))
ipython.register_magic_function(pymagic, magic_kind='cell')
这可能吗
当然,你可以按你的要求去做。应用装饰器,如下所示:
(几乎)相当于这样手动操作:
唯一的区别是
@
语法从未将未修饰的函数分配给名称空间请注意,修饰符是自下而上应用的(
bar
首先被调用,其结果被传递到foo
)在您的具体情况下,您可以执行以下操作:
我做了几个作业,只是因为行很长,如果你真的想做的话,你可以在一系列嵌套调用中完成。也可能不需要覆盖全局名称,您可以在注册的局部变量中完成所有修饰,并将未修饰的函数单独留在模块名称空间中。我还怀疑应用
.add_arguments
装饰器的顺序是否重要,但我保留了与@decorator
语法版本相同的顺序,以防万一相关问题 更多 >
编程相关推荐