我可以为我的ipython magic定义magic_参数而不使用decorator方法吗?

2024-03-29 09:37:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我定义了一个自定义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')

这可能吗


Tags: coretestincludemagicipythonhelpcellpass
1条回答
网友
1楼 · 发布于 2024-03-29 09:37:49

当然,你可以按你的要求去做。应用装饰器,如下所示:

@foo
@bar
def baz():
    pass

(几乎)相当于这样手动操作:

def baz()
    pass

baz = foo(bar(baz))

唯一的区别是@语法从未将未修饰的函数分配给名称空间

请注意,修饰符是自下而上应用的(bar首先被调用,其结果被传递到foo

在您的具体情况下,您可以执行以下操作:

def load_ipython_extension(ipython):
    from IPython.core import magic_arguments
    global pymagic
    pymagic = magic_arguments.add_magic_arg(func=pymagic, arg_attrs=(' omit', '-o', nargs='+', help='Pass file patterns to omit'))
    pymagic = magic_arguments.add_magic_arg(func=pymagic, arg_attrs=(' include', '-i', nargs='+', help='Pass file patterns to include'))
    pymagic = magic_arguments(pymagic)
    ipython.register_magic_function(pymagic, magic_kind='cell')

我做了几个作业,只是因为行很长,如果你真的想做的话,你可以在一系列嵌套调用中完成。也可能不需要覆盖全局名称,您可以在注册的局部变量中完成所有修饰,并将未修饰的函数单独留在模块名称空间中。我还怀疑应用.add_arguments装饰器的顺序是否重要,但我保留了与@decorator语法版本相同的顺序,以防万一

相关问题 更多 >