Python:正确使用 Click 与 __main__ 和 __init__

tmo*_*tmo 10 python inheritance python-click

我一直在使用Click 包,但无法让以下代码片段正常工作。

import numpy as np
import click

@click.command()
@click.option('--get_print', default = True)

class CustomClass():

     def __init__(s, get_print):

        s.data = np.random.normal(0, 1, 10)
        s.get_print = get_print

        if s.get_print:
            print("get_print =", s.get_print)

     def print_mean(s):

        print("Printing mean:")

        mean_ = np.mean(s.data)

        if s.get_print:

            print(mean_)

if __name__ == '__main__':
    CustomClass().print_mean()
Run Code Online (Sandbox Code Playgroud)

似乎该print_mean函数永远不会被调用。如果我注释掉 @Click 装饰器并手动设置get_print=True,该print_mean方法就会被很好地调用。

我怀疑 @Click 以某种方式设置__main__,所以当我if __name__ == '__main__'这样做时,它只会再次调用 Click - 但也许我错了?

在任何一种情况下,当您希望该方法继承所有选项,并且实际上能够调用类中定义的函数时,使用 Click 的正确方法是什么?__init__if __name__ == '__main__'__init__

hir*_*ist 7

这只是为了说明我在评论中的意思。用函数装饰一个函数click,并让该函数实例化您的类并执行您需要的任何成员函数。这是点击文档的建议:

import numpy as np
import click

class CustomClass:
    def __init__(self, get_print):
        self.data = np.random.normal(0, 1, 10)
        self.get_print = get_print

        if self.get_print:
            print("get_print =", self.get_print)

    def print_mean(self):
        print("Printing mean:")
        mean_ = np.mean(self.data)
        if self.get_print:
            print(mean_)

@click.command()
@click.option('--get_print', default=True)
def cli(get_print):
    cc = CustomClass(get_print)
    cc.print_mean()

if __name__ == '__main__':
    cli()
Run Code Online (Sandbox Code Playgroud)

...你可能想get_print成为一个默认的标志False

@click.command()
@click.option('--get_print', default=False, is_flag=True, required=False)
def cli(get_print):
    cc = CustomClass(get_print)
    cc.print_mean()
Run Code Online (Sandbox Code Playgroud)