【问题标题】:Python click: subcommand from partial funcPython click:来自部分函数的子命令
【发布时间】:2022-12-01 11:18:44
【问题描述】:

假设我有一个函数不是由 def 创建的,而是由 partial() 调用创建的(或者甚至只是通过赋值)。在下面的示例中,如何将 bar 作为点击子命令添加到 cli 组?我不能使用装饰器方法(与 foo 一样)。我失败的方法如下所示。

import functools
import click


@click.group()
def cli():
    pass


@cli.command()
def foo(myname="foo"):
    print(f"I am {myname}")


bar = functools.partial(foo, myname="bar")

# this has no effect
# cli.command(bar)

# results in: AttributeError: 'functools.partial' object has no attribute 'name'
# cli.add_command(bar)

# results in: AttributeError: 'functools.partial' object has no attribute 'hidden'
# cli.add_command(bar, name="bar")

if __name__ == "__main__":
    cli()


更新:实际上,看起来 partial 是这里的罪魁祸首。 This answer 在一个不同但相关的线程中,指出部分对象“缺少某些属性,特别是 __module____name__”。

【问题讨论】:

    标签: python python-click


    【解决方案1】:

    我认为您错过了 @command 装饰器将 foo 函数转换为使用 foo 作为回调的 Command 的事实。该函数仍然可以作为foo.callback访问。不过,您不能使用 partial 对象作为回调,因为它缺少 __name__,但您可以解决显式传递名称的问题:

    bar = functools.partial(foo.callback, myname="bar")
    cli.command("bar")(bar)
    
    # Alternative:
    cli.add_command(click.Command("bar", callback=bar))
    

    只要您想在bar 中包含参数,这种“模式”的适用性就非常有限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多