ArgParse:布尔曲调的必需参数

发布于 2025-02-13 16:03:41 字数 2394 浏览 0 评论 0 原文

我要做的是调用带有2个参数的python脚本,例如 - himper_level_optional_arg - preeg_data

- 准备_DATA 是布尔值默认为 false

现在,我想完成的事情,但我无法弄清楚的是:

如果 - prepary_data is false 然后string grogng > - data_tag (用于指向数据),否则不需要 - data_tag 是不需要的,但是您可以通过一个或多个可选参数数据准备,例如 - 准备_data_arg

我尝试结合地下阶层和互斥的群体,但我想我太菜鸟了,我无法使其起作用。

您能帮我还是向我指出正确的方向?

编辑: 最好用一些代码解释(我的不好)。

这是我的解析器定义:

if __name__ == "__main__":

    parser = argparse.ArgumentParser(
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,
    )
    parser.add_argument(
        "--higher_level_optional_arg",
        default=5,
        type=int,
        help="some optional arg",
    )
    parser.add_argument(
        "--prepare_data",
        dest="prepare_data",
        default=False,
        action="store_true",
        help="wether you want to prepare data or not"
    )
    parser.add_argument(
        "--data_tag",
        #required=True,
        type=str,
        help="if prepare_data is false, this should be required to retrieve existing data",
    )
    parser.add_argument(
        "--prepare_data_arg",
        default=10,
        type=int,
        help="if prepare_data is true you can pass this if you want",
    )

    args = parser.parse_args()
    higher_level_optional_arg = args.higher_level_optional_arg
    prepare_data = args.prepare_data
    data_tag = args.data_tag
    prepare_data_arg = args.prepare_data_arg

    main()

然后,在 main 中,正如@hpaulj所建议的,我可以将我需要的逻辑放在:

def main():
    if not prepare_data:
        if not data_tag:
            raise Exception("you need to pass --data_tag to retrieve the existing data")
        else:
            # retrieve the data with the data_tag
            print("loading data...")
    else:
        # prepare the data using prepare_data_arg, if passed
        print("preparing data...")

但是谁在运行脚本的人不知道 data_tag 如果 prepar_data == false ,并且他不应该收到此例外,则需要。

请注意,如果 prepar_data == true ,则不需要 data_tag ,所以我不想输入必需= true

我重新制定的问题是:我可以在解析器定义中实现自己在这里做的事情吗?

What I'm trying to do is to call a python script with 2 arguments, let's say --higher_level_optional_arg and --prepare_data.

--prepare_data is a boolean defaulting to False.

Now the thing I'd like to accomplish but that I cannot figure out is:

if --prepare_data is False then a string argument --data_tag (used to point to the data) is required, otherwise --data_tag is not required but you can pass one or more optional arguments for data preparation, e.g. --prepare_data_arg.

I tried combining subparsers and mutually exclusive groups but I guess I'm too noob and I cannot make it work.

Can you help me or point me in the right direction ?

EDIT :
Better to explain with some code (my bad).

Here's my parser definition:

if __name__ == "__main__":

    parser = argparse.ArgumentParser(
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,
    )
    parser.add_argument(
        "--higher_level_optional_arg",
        default=5,
        type=int,
        help="some optional arg",
    )
    parser.add_argument(
        "--prepare_data",
        dest="prepare_data",
        default=False,
        action="store_true",
        help="wether you want to prepare data or not"
    )
    parser.add_argument(
        "--data_tag",
        #required=True,
        type=str,
        help="if prepare_data is false, this should be required to retrieve existing data",
    )
    parser.add_argument(
        "--prepare_data_arg",
        default=10,
        type=int,
        help="if prepare_data is true you can pass this if you want",
    )

    args = parser.parse_args()
    higher_level_optional_arg = args.higher_level_optional_arg
    prepare_data = args.prepare_data
    data_tag = args.data_tag
    prepare_data_arg = args.prepare_data_arg

    main()

Then, in main, as suggested by @hpaulj I can put the logic I need as:

def main():
    if not prepare_data:
        if not data_tag:
            raise Exception("you need to pass --data_tag to retrieve the existing data")
        else:
            # retrieve the data with the data_tag
            print("loading data...")
    else:
        # prepare the data using prepare_data_arg, if passed
        print("preparing data...")

But who's running the script doesn't know that --data_tag is required if prepare_data==False and s/he shouldn't receive an Exception for that, imo.

(notice that data_tag is not required if prepare_data==True so I don't don't want to uncomment the required=True)

My reformulated question is: can I achieve what I'm doing here within the parser definition ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文